הוספת מחלקות ופריטים של 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++ stub להטמעת קוד השרת. לדוגמה:
    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 כדי להוסיף את קובץ ההטמעה ( modulename Configs.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. (אופציונלי) הוסף ערך מניפסט. אם הוא לא קיים, ברירת המחדל היא שם המופע "ברירת המחדל" של 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 עבור .hal נמצאים ב- 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);
    
    בדוגמה זו, פריט ConfigStore disableInitBlank מאוחזר ומאוחסן במשתנה (שימושי כאשר יש צורך לגשת למשתנה מספר פעמים). הערך שאוחזר מה-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) \