میتوانید موارد 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بهروز میکنند. - کد پایه 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را اصلاح کنید تا فایل پیادهسازی (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
- (اختیاری) ورودی مانیفست اضافه کنید. اگر وجود نداشته باشد، به نام نمونه «پیشفرض» 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) \