אפשר להוסיף פריטים חדשים של ConfigStore (כלומר שיטות ממשק) לכיתה קיימת של ממשק. אם לא מגדירים את סוג הממשק, צריך להוסיף סוג חדש לפני שאפשר להוסיף פריט 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
. - יוצרים את הסטאב של 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
, ולמפות את דגלי ה-build להגדרות של המאקרו. לדוגמה, ב-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
- (אופציונלי) מוסיפים רשומה למניפסט. אם הוא לא קיים, ברירת המחדל היא שם המכונה 'default' של ConfigStore. לדוגמה, ב-
device/google/marlin/manifest.xml
:<hal format="hidl"> <name>android.hardware.configstore</name> ... <interface> <name>IChargerConfigs</name> <instance>default</instance> </interface> </hal>
- מוסיפים את כלל sepolicy לפי הצורך (כלומר, אם ללקוח אין הרשאות לבצע קריאות 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) \