افزودن کلاس ها و آیتم های 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. در صورت نیاز، قانون 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) \