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

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