יישום השירות

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

הפקת קוד ממשק

כדי ליצור קוד boilerplate עבור הממשק, הפעל 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 וכדי למפות דגלי build להגדרות מאקרו. לדוגמה, אתה יכול לשנות את 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, שירות ה-config HAL צריך להתחיל מוקדם ככל האפשר, מיד לאחר hwservicemanager מוכן. מכיוון ששירות ה-config HAL אינו קורא קבצים חיצוניים, הוא צפוי להיות מוכן במהירות לאחר השקתו.