يمكنك إضافة عناصر 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لإضافة ملف التنفيذ (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>
- يمكنك الوصول إلى عنصر ConfigStore باستخدام دالة النموذج المناسبة في
android.hardware.configstore-utils. على سبيل المثال، في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) \