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