إضافة فئات 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، ولربط علامات الإنشاء بتعريفات وحدات الماكرو. على سبيل المثال، في 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 الخاصة بـ 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);
    
    في هذا المثال، يتم استرداد عنصر 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) \