הוספת מחלקות ופריטים של ConfigStore

אפשר להוסיף פריטים חדשים של ConfigStore (כלומר שיטות ממשק) לכיתה קיימת של ממשק. אם לא מגדירים את סוג הממשק, צריך להוסיף סוג חדש לפני שאפשר להוסיף פריט ConfigStore לסוג הזה. בקטע הזה נעשה שימוש בדוגמה של פריט תצורה disableInitBlank עבור healthd שנוסף לכיתה של הממשק IChargerConfigs.

הוספת כיתות ממשק

אם לא הוגדר סיווג ממשק לשיטת הממשק שרוצים להוסיף, צריך להוסיף את סוג הממשק לפני שאפשר להוסיף את הפריטים המשויכים של ConfigStore.

  1. יצירת קובץ ממשק 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
    };
    
  2. מעדכנים את 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.
  3. יוצרים את הסטאב של 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.
  4. פותחים את קובצי ההטמעה .h ו-.cpp ומסירים את הקוד שקשור לפונקציה HIDL_FETCH_name (לדוגמה, HIDL_FETCH_IChargerConfigs). הפונקציה הזו נדרשת למצב העברה של HIDL, שבו ConfigStore לא משתמש.
  5. רושמים את ההטמעה בשירות 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
    }
    
  6. משנים את הקובץ 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
    
  7. (אופציונלי) מוסיפים רשומה למניפסט. אם הוא לא קיים, ברירת המחדל היא שם המכונה 'default' של ConfigStore. לדוגמה, ב-device/google/marlin/manifest.xml:
        <hal format="hidl">
            <name>android.hardware.configstore</name>
            ...
            <interface>
                <name>IChargerConfigs</name>
                <instance>default</instance>
            </interface>
        </hal>
    
  8. מוסיפים את כלל sepolicy לפי הצורך (כלומר, אם ללקוח אין הרשאות לבצע קריאות hwbinder אל hal_configstore). לדוגמה, ב-system/sepolicy/private/healthd.te:
    ... // other rules
    binder_call(healthd, hal_configstore)
    

הוספת פריטים חדשים ב-ConfigStore

כדי להוסיף פריט חדש ל-ConfigStore:

  1. פותחים את קובץ ה-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);
    };
    
  2. מטמיעים את השיטה בקובצי ההטמעה המתאימים של ממשק 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:

  1. כוללים את קובצי הכותרות הנדרשים. לדוגמה, ב-system/core/healthd/healthd.cpp:
    #include <android/hardware/configstore/1.0/IChargerConfigs.h>
    #include <configstore/Utils.h>
    
  2. ניגשים לפריט 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 בקריאות מאוחרות יותר לפונקציית התבנית שנוצרה.
  3. מוסיפים את התלות ב-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) \