افزودن کلاس‌ها و عناصر ConfigStore

می‌توانید موارد ConfigStore جدید (یعنی روش‌های میانجی) را برای کلاس میانجی موجود اضافه کنید. اگر کلاس میانای تعریف نشده باشد، باید کلاس جدیدی اضافه کنید تا بتوانید برای آن کلاس مورد ConfigStore اضافه کنید. این بخش از نمونه عنصر پیکربندی disableInitBlank برای healthd که به کلاس میانای IChargerConfigs اضافه می‌شود استفاده می‌کند.

افزودن کلاس‌های میانای کاربری

اگر برای روش واسطی که می‌خواهید اضافه کنید کلاس واسطی تعریف نشده است، باید کلاس واسط را قبل‌از اینکه بتوانید عناصر ConfigStore مرتبط را اضافه کنید اضافه کنید.

  1. فایل رابط HAL ایجاد کنید. نسخه 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. بااستفاده از تابع الگوی مناسب در android.hardware.configstore-utils، به عنصر ConfigStore دسترسی پیدا کنید. برای مثال، در 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) \