יישום השירות

כדי להתכונן ליישום HAL, תוכל ליצור קוד ממשק בסיסי של ConfigStore ולאחר מכן לשנות אותו בהתאם לצרכיך.

יצירת קוד ממשק

כדי ליצור קוד מוכן מראש עבור הממשק, לרוץ hidl-gen . לדוגמה, כדי ליצור קוד surfaceflinger :

hidl-gen -o hardware/interfaces/configstore/1.0/default \
    -Lc++-impl \
    -randroid.hardware:hardware/interfaces \
    -randroid.hidl:system/libhidl/transport \
    android.hardware.config@1.0::ISurfaceFlingerConfigs

שינוי Android.mk

הבא, לשנות את Android.mk קובץ כדי להוסיף את הקובץ ביישום ( <modulename>Configs.cpp ) כדי LOCAL_SRC_FILES ולמפות דגלים לבנות לתוך הגדרות מאקרו. לדוגמה, אתה יכול לשנות surfaceflinger ב hardware/interface/configstore/1.0/default/Android.mk :

LOCAL_SRC_FILES += SurfaceFlingerConfigs.cpp
ifneq ($(NUM_FRAMEBUFFER_SURFACE_BUFFERS),)
    LOCAL_CFLAGS += -DNUM_FRAMEBUFFER_SURFACE_BUFFERS=$(NUM_FRAMEBUFFER_SURFACE_BUFFERS)
endif

ifeq ($(TARGET_RUNNING_WITHOUT_SYNC_FRAMEWORK),true)
    LOCAL_CFLAGS += -DRUNNING_WITHOUT_SYNC_FRAMEWORK
endif

אם Android.mk כוללת מספר ifeq-endif בלוקים, שקול להעביר את הקוד שלך לתוך קובץ חדש (כלומר, surfaceflinger.mk ) אז לכלול קובץ מ Android.mk .

יישום פונקציות

כדי למלא את הפונקציות ליישם את HAL, להתקשר בחזרה _hidl_cb פונקציה עם ערכים שונים (מותנה דגלים לבנות). לדוגמה, אתה יכול למלא את הפונקציות עבור surfaceflinger ב hardware/interfaces/configstore/1.0/default/SurfaceFlingerConfigs.cpp :

Return<void> SurfaceFlingerConfigs::numFramebufferSurfaceBuffers(
        numFramebufferSurfaceBuffers_cb _hidl_cb) {
    #if NUM_FRAMEBUFFER_SURFACE_BUFFERS 2
    _hidl_cb(NumBuffers.TWO);
    #else if NUM_FRAMEBUFFER_SURFACE_BUFFERS 3
    _hidl_cb(NumBuffers.THREE);
    #else
    _hidl_cb(NumBuffers.USE_DEFAULT);
    #endif
}

Return<void> SurfaceFlingerConfigs::runWithoutSyncFramework(
        runWithoutSyncFramework_cb _hidl_cb) {
    #ifdef RUNNING_WITHOUT_SYNC_FRAMEWORK
    _hidl_cb({true /* specified */, true /* value */});
    #else
    // when macro not defined, we can give any value to the second argument.
    // It will simply be ignored in the framework side.
    _hidl_cb({false /* specified */, false /* value */});
    #endif
}

ודא שהיישום אינו מכיל פונקציה בשם HIDL_FETCH_ interface-name (למשל, HIDL_FETCH_ISurfaceFlingerConfigs ). פונקציה זו נדרשת במצב התמסורת HIDL, שהינה בשימוש (ואסר) על ידי configstore . ConfigStore חייב תמיד לפעול במצב מאוגד.

הרשמה כשירות

לבסוף, לרשום את כל יישומי ממשק אל configstore שירות. לדוגמה, אתה יכול לרשום surfaceflinger מימושים ב hardware/interfaces/configstore/1.0/default/service.cpp :

configureRpcThreadpool(maxThreads, true);
sp<ISurfaceFlingerConfigs> surfaceFlingerConfigs = new SurfaceFlingerConfigs;
status_t status = surfaceFlingerConfigs->registerAsService();

sp<IBluetoothConfigs> bluetoothConfigs = new BluetoothConfigs;
status = bluetoothConfigs->registerAsService();

// register more interfaces here
joinRpcThreadpool();

הבטחת גישה מוקדמת

כדי להבטיח כי מודול מסגרת יכול להגיע מוקדם גישה לשירות HAL, שירות HAL config צריך להתחיל מוקדם ככל האפשר, רק לאחר hwservicemanager מוכן. מכיוון ששירות HAL config אינו קורא קבצים חיצוניים, הוא צפוי להיות מוכן במהירות לאחר השקתו.