הטמעת השירות

כדי להתכונן להטמעה של 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 עם ערכים שונים (מותנית ב-build) ). לדוגמה, אפשר למלא את הפונקציות של 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();

הקפידו לקבל גישה מוקדמת

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