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