إضافة فئات 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 لملفَي header وملف المكتبة المشترَكة 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. (اختياري) أضِف إدخالًا في البيان. وإذا لم يكن متوفّرًا، يتم ضبط القيمة التلقائية على اسم المثيل "default" من 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) \