می توانید آیتم های جدید ConfigStore (یعنی روش های رابط) را برای کلاس رابط موجود اضافه کنید. اگر کلاس رابط تعریف نشده است، باید یک کلاس جدید اضافه کنید تا بتوانید یک آیتم ConfigStore برای آن کلاس اضافه کنید. این بخش از مثال آیتم پیکربندی disableInitBlank برای healthd استفاده می کند که به کلاس رابط IChargerConfigs اضافه شده است.
اضافه کردن کلاس های رابط
اگر هیچ کلاس رابطی برای متد واسطی که میخواهید اضافه کنید تعریف نشده است، قبل از اینکه بتوانید موارد ConfigStore مرتبط را اضافه کنید، باید کلاس رابط را اضافه کنید.
- یک فایل رابط 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 }; 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::IChargerConfigshidl-gen -o hardware/interfaces/configstore/1.0/default -Landroidbp -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.configstore@1.0::IChargerConfigsAndroid.bpوAndroid.mkدرhardware/interfaces/configstore/1.0به روز می کنند.- برای پیاده سازی کد سرور، 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ایجاد می کند. - فایلهای پیادهسازی
.hو.cppرا باز کنید و کد مربوط بهHIDL_FETCH_ nameرا حذف کنید (به عنوان مثال،HIDL_FETCH_IChargerConfigs). این تابع برای حالت عبور HIDL، که توسط ConfigStore استفاده نمیشود، مورد نیاز است. - پیاده سازی را در سرویس 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 } - فایل
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
- (اختیاری) یک ورودی مانیفست اضافه کنید. اگر وجود ندارد، بهطور پیشفرض نام نمونه «پیشفرض» ConfigStore را انتخاب کنید. به عنوان مثال، در
device/google/marlin/manifest.xml:<hal format="hidl"> <name>android.hardware.configstore</name> ... <interface> <name>IChargerConfigs</name> <instance>default</instance> </interface> </hal> - در صورت نیاز، قانون sepolicy را اضافه کنید (یعنی اگر مشتری مجوز برقراری تماس های hwbinder به
hal_configstoreرا نداشته باشد). به عنوان مثال، درsystem/sepolicy/private/healthd.te:... // other rules binder_call(healthd, hal_configstore)
موارد جدید ConfigStore را اضافه کنید
برای افزودن یک مورد جدید ConfigStore:
- فایل 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); }; - روش را در فایل های پیاده سازی 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:
- فایل های هدر مورد نیاز را وارد کنید. به عنوان مثال، در
system/core/healthd/healthd.cpp:#include <android/hardware/configstore/1.0/IChargerConfigs.h> #include <configstore/Utils.h>
- با استفاده از تابع الگوی مناسب در
android.hardware.configstore-utilsبه مورد ConfigStore دسترسی پیدا کنید. به عنوان مثال، درsystem/core/healthd/healthd.cpp: در این مثال، مورد ConfigStoreusing namespace android::hardware::configstore; using namespace android::hardware::configstore::V1_0; static int64_t disableInitBlank = getBool< IChargerConfigs, &IChargerConfigs::disableInitBlank>(false);disableInitBlankبازیابی و در یک متغیر ذخیره میشود (زمانی که نیاز به چندین بار دسترسی به متغیر باشد مفید است). مقدار بازیابی شده از ConfigStore در داخل تابع الگوی نمونه سازی شده ذخیره می شود تا بتوان آن را به سرعت از مقدار ذخیره شده بدون تماس با سرویس ConfigStore برای تماس های بعدی با تابع الگوی نمونه برداری شده بازیابی کرد. - وابستگی به 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) \