شما میتوانید آیتمهای جدید ConfigStore (یعنی متدهای رابط) را برای یک کلاس رابط موجود اضافه کنید. اگر کلاس رابط تعریف نشده باشد، قبل از اینکه بتوانید یک آیتم ConfigStore برای آن کلاس اضافه کنید، باید یک کلاس جدید اضافه کنید. در این بخش از مثال یک آیتم پیکربندی disableInitBlank برای healthd که به کلاس رابط IChargerConfigs اضافه میشود، استفاده میشود.
اضافه کردن کلاسهای رابط
اگر هیچ کلاس رابطی برای متد رابطی که میخواهید اضافه کنید تعریف نشده باشد، قبل از اینکه بتوانید آیتمهای مرتبط با ConfigStore را اضافه کنید، باید کلاس رابط را اضافه کنید.
- یک فایل رابط 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 }; 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بهروزرسانی میکنند.- برای پیادهسازی کد سرور، stub مربوط به ++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اضافه شود و پرچمهای ساخت (build flags) به تعاریف ماکرو نگاشت شوند. برای مثال، در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> - در صورت نیاز (یعنی اگر کلاینت مجوزهای لازم برای فراخوانی hwbinder به
hal_configstoreرا ندارد) قانون sepolicy را اضافه کنید. برای مثال، در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) \