إضافة فئات وعناصر 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 لإضافة ملف التنفيذ ( modulename Configs.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);
    
    في هذا المثال، يتم استرداد عنصر 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) \