אפשר להוסיף פריטים חדשים ב-ConfigStore (כלומר, methods של ממשק) עבור
מחלקה של הממשק הקיים. אם מחלקת הממשק לא מוגדרת, עליך להוסיף
מחלקה חדשה לפני שתוכלו להוסיף פריט ConfigStore עבור המחלקה הזו. הקטע הזה
משתמש בדוגמה של פריט הגדרה disableInitBlank
עבור
healthd
נוסף לממשק IChargerConfigs
בכיתה.
הוספת מחלקות ממשק
אם לא הוגדר סוג ממשק לשיטת הממשק שאתם רוצים מוסיפים את מחלקת הממשק לפני שאפשר להוסיף את פריטים ב-ConfigStore.
- יצירת קובץ ממשק HAL. הגרסה של ConfigStore היא 1.0, לכן צריך להגדיר
ממשקי ConfigStore ב-
hardware/interfaces/configstore/1.0
. עבור לדוגמה, ב-hardware/interfaces/configstore/1.0/IChargerConfigs.hal
:package android.hardware.configstore@1.0; interface IChargerConfigs { // TO-BE-FILLED-BELOW };
- עדכון של
Android.bp
ו-Android.mk
עבור ספריות משותפות וקובצי כותרות של ConfigStore כדי לכלול את HAL של הממשק החדש. מוצרים לדוגמה:hidl-gen -o hardware/interfaces/configstore/1.0/default -Lmakefile -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.configstore@1.0::IChargerConfigs
hidl-gen -o hardware/interfaces/configstore/1.0/default -Landroidbp -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.configstore@1.0::IChargerConfigs
Android.bp
ואתAndroid.mk
ב-hardware/interfaces/configstore/1.0
- יצירת stub של C++ להטמעת קוד השרת. מוצרים לדוגמה:
hidl-gen -o hardware/interfaces/configstore/1.0/default -Lc++-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.configstore@1.0::IChargerConfigs
הפקודה הזו יוצרת שני קבצים,ChargerConfigs.h
ו-ChargerConfigs.cpp
, בhardware/interfaces/configstore/1.0/default
- פותחים את קובצי ההטמעה
.h
ו-.cpp
מסירים את הקוד שקשור לפונקציהHIDL_FETCH_name
(בשביל לדוגמה,HIDL_FETCH_IChargerConfigs
). הפונקציה הזו נדרשת כדי מצב מעבר HIDL, שלא נמצא בשימוש של ConfigStore. - רושמים את ההטמעה בשירות ConfigStore. לדוגמה, ב-
hardware/interfaces/configstore/1.0/default/service.cpp
:#include <android/hardware/configstore/1.0/IChargerConfigs.h> #include "ChargerConfigs.h" using android::hardware::configstore::V1_0::IChargerConfigs; using android::hardware::configstore::V1_0::implementation::ChargerConfigs; int main() { ... // other code sp<IChargerConfigs> chargerConfigs = new ChargerConfigs; status = chargerConfigs->registerAsService(); LOG_ALWAYS_FATAL_IF(status != OK, "Could not register IChargerConfigs"); ... // other code }
- משנים את הקובץ
Android.mk
כדי להוסיף את קובץ ההטמעה (modulenameConfigs.cpp
) אלLOCAL_SRC_FILES
ולמפות דגלים להגדרות מאקרו. לדוגמה, ב-hardware/interfaces/configstore/1.0/default/Android.mk
:LOCAL_SRC_FILES += ChargerConfigs.cpp ifeq ($(strip $(BOARD_CHARGER_DISABLE_INIT_BLANK)),true) LOCAL_CFLAGS += -DCHARGER_DISABLE_INIT_BLANK endif
- (אופציונלי) מוסיפים רשומת מניפסט. אם הוא לא קיים, ברירת המחדל תהיה
'ברירת מחדל' שם המופע של ConfigStore. לדוגמה, ב-
device/google/marlin/manifest.xml
:<hal format="hidl"> <name>android.hardware.configstore</name> ... <interface> <name>IChargerConfigs</name> <instance>default</instance> </interface> </hal>
- מוסיפים את כלל המדיניות במקרה הצורך (כלומר, אם ללקוח אין
הרשאות לביצוע הפעלות של hwbinder ל-
hal_configstore
). עבור לדוגמה, ב-system/sepolicy/private/healthd.te
:... // other rules binder_call(healthd, hal_configstore)
הוספת פריטים חדשים ב-ConfigStore
כדי להוסיף פריט ConfigStore חדש:
- פותחים את קובץ ה-HAL ומוסיפים את שיטת הממשק הנדרשת לפריט. (ה
.hal
קבצים ב-ConfigStore נמצאיםhardware/interfaces/configstore/1.0
). לדוגמה, ב-hardware/interfaces/configstore/1.0/IChargerConfigs.hal
:package android.hardware.configstore@1.0; interface IChargerConfigs { ... // Other interfaces disableInitBlank() generates(OptionalBool value); };
- הטמעת השיטה בקובצי ההטמעה התואמים עם HAL בממשק
(
.h
ו-.cpp
). מציבים את הטמעות ברירת המחדל ב:hardware/interfaces/configstore/1.0/default
. לדוגמה, ב-hardware/interfaces/configstore/1.0/default/ChargerConfigs.h
:struct ChargerConfigs : public IChargerConfigs { ... // Other interfaces Return<void> disableInitBlank(disableInitBlank_cb _hidl_cb) override; };
ובתוךhardware/interfaces/configstore/1.0/default/ChargerConfigs.cpp
:Return<void> ChargerConfigs::disableInitBlank(disableInitBlank_cb _hidl_cb) { bool value = false; #ifdef CHARGER_DISABLE_INIT_BLANK value = true; #endif _hidl_cb({true, value}); return Void(); }
שימוש בפריטים ב-ConfigStore
כדי להשתמש בפריט ConfigStore:
- כוללים את קובצי הכותרות הנדרשים. לדוגמה, ב-
system/core/healthd/healthd.cpp
:#include <android/hardware/configstore/1.0/IChargerConfigs.h> #include <configstore/Utils.h>
- לגשת לפריט ב-ConfigStore באמצעות פונקציית התבנית המתאימה
android.hardware.configstore-utils
לדוגמה, ב-system/core/healthd/healthd.cpp
:using namespace android::hardware::configstore; using namespace android::hardware::configstore::V1_0; static int64_t disableInitBlank = getBool< IChargerConfigs, &IChargerConfigs::disableInitBlank>(false);
בדוגמה הזו, הפריטdisableInitBlank
מ-ConfigStore מאוחזר ונשמרים במשתנה פעמים). הערך שאוחזר מ-ConfigStore נשמר במטמון של פונקציית האינסטינקטים, כך שאפשר לאחזר אותה במהירות ערך שנשמר במטמון בלי ליצור קשר עם שירות ConfigStore לצורך ביצוע קריאות מאוחרות יותר של פונקציית המופע של התבנית. - מוסיפים את התלות ב-ConfigStore וב-
configstore-utils
בספרייהAndroid.mk
אוAndroid.bp
. לדוגמה, ב-system/core/healthd/Android.mk
:LOCAL_SHARED_LIBRARIES := \ android.hardware.configstore@1.0 \ android.hardware.configstore-utils \ ... (other libraries) \