אפשר להוסיף פריטים חדשים ב-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
בשביל קובצי ה-header והספרייה המשותפת של 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
ולמפות דגלי 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
- (אופציונלי) מוסיפים רשומת מניפסט. אם הוא לא קיים, השתמשו בשם 'ברירת המחדל' למכונה של 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) \