می توانید آیتم های جدید 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::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
به روز می کنند.- برای پیاده سازی کد سرور، 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) \