يمكنك إضافة عناصر 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
لإضافة ملف التنفيذ (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
- (اختياري) أضِف إدخالًا في البيان. وإذا لم يكن متوفّرًا، يتم ضبط القيمة التلقائية على اسم المثيل
"default" من 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
:using namespace android::hardware::configstore; using namespace android::hardware::configstore::V1_0; static int64_t disableInitBlank = getBool< IChargerConfigs, &IChargerConfigs::disableInitBlank>(false);
في هذا المثال، يتم استرداد عنصر ConfigStoredisableInitBlank
وحفظه في متغيّر (يكون ذلك مفيدًا عند الحاجة إلى الوصول إلى المتغيّر عدة مرات). يتم تخزين القيمة التي يتم استرجاعها من 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) \