إضافة صفوف وعناصر ConfigStore

يمكنك إضافة عناصر ConfigStore الجديدة (أي طرق الواجهة) لفئة واجهة حالية. إذا لم تكن فئة الواجهة محددة، يجب إضافة فئة جديدة قبل أن تتمكن من إضافة عنصر ConfigStore لهذه الفئة. يستخدم هذا القسم مثالاً على عنصر الإعداد disableInitBlank لإضافة healthd إلى فئة الواجهة IChargerConfigs.

إضافة فئات الواجهة

إذا لم يتم تحديد فئة واجهة لطريقة الواجهة التي تريد إضافتها، عليك إضافة فئة الواجهة قبل أن تتمكّن من إضافة عناصر ConfigStore المرتبطة.

  1. أنشئ ملف واجهة HAL. الإصدار 1.0 من ConfigStore، لذا يجب تحديد واجهات 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);
    
    في هذا المثال، يتم استرداد العنصر 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) \