إضافة صفوف وعناصر 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) \