اعتبارًا من 27 آذار (مارس) 2025، ننصحك باستخدام android-latest-release بدلاً من aosp-main لإنشاء AOSP والمساهمة فيه. لمزيد من المعلومات، يُرجى الاطّلاع على التغييرات في AOSP.
تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
يمكنك إضافة عناصر ConfigStore جديدة (أي طرق الواجهة) لأحد
فئات الواجهات الحالية. إذا لم يتم تحديد فئة الواجهة، يجب إضافة
فئة جديدة قبل أن تتمكّن من إضافة عنصر ConfigStore لهذه الفئة. يستخدم هذا القسم مثالاً على عنصر إعدادات disableInitBlank لإضافة
healthd إلى فئة IChargerConfigs
واجهة.
إضافة فئات الواجهات
إذا لم يتم تحديد فئة واجهة لطريقة الواجهة التي تريد
إضافتها، عليك إضافة فئة الواجهة قبل أن تتمكّن من إضافة عناصر
ConfigStore المرتبطة بها.
أنشئ ملف واجهة HAL. إصدار ConfigStore هو 1.0، لذا حدِّد
واجهات ConfigStore في hardware/interfaces/configstore/1.0. على سبيل المثال، في
hardware/interfaces/configstore/1.0/IChargerConfigs.hal:
ينشئ هذا الأمر ملفين، 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:
(اختياري) أضِف إدخالًا في البيان. وإذا لم يكن متوفّرًا، يتم ضبط القيمة التلقائية على اسم المثيل
"default" من ConfigStore. على سبيل المثال، في
device/google/marlin/manifest.xml:
أضِف قاعدة 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:
نفِّذ الطريقة في ملفات تنفيذ واجهة 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:
يمكنك الوصول إلى عنصر 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);
في هذا المثال، يتم استرداد عنصر ConfigStore disableInitBlank
وحفظه في متغيّر (يكون ذلك مفيدًا عند الحاجة إلى الوصول إلى المتغيّر عدة
مرات). يتم تخزين القيمة التي يتم استرجاعها من ConfigStore مؤقتًا داخل دالة النموذج التي تم إنشاؤها
حتى يمكن استرجاعها بسرعة من القيمة
المخزّنة مؤقتًا بدون التواصل مع خدمة ConfigStore لإجراء طلبات لاحقة لدالة النموذج التي تم إنشاؤها.
أضِف الاعتماد على ConfigStore وconfigstore-utils
المكتبة في Android.mk أو Android.bp. على سبيل المثال، في
system/core/healthd/Android.mk:
يخضع كل من المحتوى وعيّنات التعليمات البرمجية في هذه الصفحة للتراخيص الموضحّة في ترخيص استخدام المحتوى. إنّ Java وOpenJDK هما علامتان تجاريتان مسجَّلتان لشركة Oracle و/أو الشركات التابعة لها.
تاريخ التعديل الأخير: 2025-07-26 (حسب التوقيت العالمي المتفَّق عليه)
[null,null,["تاريخ التعديل الأخير: 2025-07-26 (حسب التوقيت العالمي المتفَّق عليه)"],[],[],null,["# Add ConfigStore classes and items\n\n| **Warning:** Android 10 deprecates the ConfigStore HAL and replaces the HAL with system properties. For details, refer to [Configuring](/docs/core/architecture/configuration).\n\nYou can add new ConfigStore items (that is, interface methods) for an\nexisting interface class. If the interface class isn't defined, you must add a\nnew class before you can add a ConfigStore item for that class. This section\nuses the example of a `disableInitBlank` configuration item for\n`healthd` being added to the `IChargerConfigs` interface\nclass.\n| **Note:** Before continuing, ensure that you're familiar with [general HIDL\n| concepts](/docs/core/architecture/hidl), [HIDL C++\n| development workflow](/docs/core/architecture/hidl-cpp), [HIDL Code Style](/docs/core/architecture/hidl/code-style), and [ConfigStore design](/docs/core/architecture/configstore).\n\nAdd interface classes\n---------------------\n\nIf no interface class is defined for the interface method that you want to\nadd, you must add the interface class before you can add the associated\nConfigStore items.\n\n1. Create a HAL interface file. The ConfigStore version is 1.0, so define ConfigStore interfaces in `hardware/interfaces/configstore/1.0`. For example, in `hardware/interfaces/configstore/1.0/IChargerConfigs.hal`: \n\n ```\n package android.hardware.configstore@1.0;\n\n interface IChargerConfigs {\n // TO-BE-FILLED-BELOW\n };\n ```\n2. Update `Android.bp` and `Android.mk` for the ConfigStore shared library and header files to include the new interface HAL. For example: \n\n 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\n 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\n\n These commands update `Android.bp` and `Android.mk` in `hardware/interfaces/configstore/1.0`.\n3. Generate the C++ stub for implementing the server code. For example: \n\n ```\n 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\n ```\n This command creates two files, `ChargerConfigs.h` and `ChargerConfigs.cpp`, in `hardware/interfaces/configstore/1.0/default`.\n4. Open the `.h` and `.cpp` implementation files and remove code related to the function `HIDL_FETCH_`\u003cvar translate=\"no\"\u003ename\u003c/var\u003e (for example, `HIDL_FETCH_IChargerConfigs`). This function is needed for HIDL passthrough mode, which isn't used by ConfigStore.\n5. Register the implementation to the ConfigStore service. For example, in `hardware/interfaces/configstore/1.0/default/service.cpp`: \n\n ```\n #include \u003candroid/hardware/configstore/1.0/IChargerConfigs.h\u003e\n #include \"ChargerConfigs.h\"\n\n using android::hardware::configstore::V1_0::IChargerConfigs;\n using android::hardware::configstore::V1_0::implementation::ChargerConfigs;\n\n int main() {\n ... // other code\n sp\u003cIChargerConfigs\u003e chargerConfigs = new ChargerConfigs;\n status = chargerConfigs-\u003eregisterAsService();\n LOG_ALWAYS_FATAL_IF(status != OK, \"Could not register IChargerConfigs\");\n ... // other code\n }\n ```\n6. Modify the `Android.mk` file to add the implementation file (\u003cvar translate=\"no\"\u003emodulename\u003c/var\u003e`Configs.cpp`) to `LOCAL_SRC_FILES` and to map build flags into macro definitions. For example, in `hardware/interfaces/configstore/1.0/default/Android.mk`: \n\n ```\n LOCAL_SRC_FILES += ChargerConfigs.cpp\n\n ifeq ($(strip $(BOARD_CHARGER_DISABLE_INIT_BLANK)),true)\n LOCAL_CFLAGS += -DCHARGER_DISABLE_INIT_BLANK\n endif\n ```\n7. (Optional) Add a manifest entry. If it doesn't exist, default to the \"default\" instance name of ConfigStore. For example, in `device/google/marlin/manifest.xml`: \n\n ```\n \u003chal format=\"hidl\"\u003e\n \u003cname\u003eandroid.hardware.configstore\u003c/name\u003e\n ...\n \u003cinterface\u003e\n \u003cname\u003eIChargerConfigs\u003c/name\u003e\n \u003cinstance\u003edefault\u003c/instance\u003e\n \u003c/interface\u003e\n \u003c/hal\u003e\n ```\n8. Add the sepolicy rule if needed (that is, if the client doesn't have permissions for making hwbinder calls to `hal_configstore`). For example, in `system/sepolicy/private/healthd.te`: \n\n ```\n ... // other rules\n binder_call(healthd, hal_configstore)\n ```\n\nAdd new ConfigStore items\n-------------------------\n\nTo add a new ConfigStore item:\n\n1. Open the HAL file and add the required interface method for the item. (The `.hal` files for ConfigStore reside in `hardware/interfaces/configstore/1.0`.) For example, in `hardware/interfaces/configstore/1.0/IChargerConfigs.hal`: \n\n ```\n package android.hardware.configstore@1.0;\n\n interface IChargerConfigs {\n ... // Other interfaces\n disableInitBlank() generates(OptionalBool value);\n };\n ```\n2. Implement the method in the corresponding interface HAL implementation files (`.h` and `.cpp`). Place the default implementations in `hardware/interfaces/configstore/1.0/default`. **Note:** Running `hidl-gen` with `-Lc++-impl` generates skeleton code for the newly added interface method. However, it also overwrites implementations for all existing interface methods, so use the `-o` option appropriately.\n For example, in `hardware/interfaces/configstore/1.0/default/ChargerConfigs.h`: \n\n ```\n struct ChargerConfigs : public IChargerConfigs {\n ... // Other interfaces\n Return\u003cvoid\u003e disableInitBlank(disableInitBlank_cb _hidl_cb) override;\n };\n ```\n And in `hardware/interfaces/configstore/1.0/default/ChargerConfigs.cpp`: \n\n ```\n Return\u003cvoid\u003e ChargerConfigs::disableInitBlank(disableInitBlank_cb _hidl_cb) {\n bool value = false;\n #ifdef CHARGER_DISABLE_INIT_BLANK\n value = true;\n #endif\n _hidl_cb({true, value});\n return Void();\n }\n ```\n\nUse ConfigStore items\n---------------------\n\nTo use a ConfigStore item:\n\n1. Include the required header files. For example, in `system/core/healthd/healthd.cpp`: \n\n ```\n #include \u003candroid/hardware/configstore/1.0/IChargerConfigs.h\u003e\n #include \u003cconfigstore/Utils.h\u003e\n ```\n2. Access the ConfigStore item using the appropriate template function in `android.hardware.configstore-utils`. For example, in `system/core/healthd/healthd.cpp`: \n\n ```\n using namespace android::hardware::configstore;\n using namespace android::hardware::configstore::V1_0;\n\n static int64_t disableInitBlank = getBool\u003c\n IChargerConfigs,\n &IChargerConfigs::disableInitBlank\u003e(false);\n ```\n In this example, the ConfigStore item `disableInitBlank` is retrieved and stored to a variable (useful when the variable needs to be accessed multiple times). The value retrieved from the ConfigStore is cached inside the instantiated template function so that it can be retrieved quickly from the cached value without contacting the ConfigStore service for later calls to the instantiated template function.\n3. Add the dependency on ConfigStore and the `configstore-utils` library in `Android.mk` or `Android.bp`. For example, in `system/core/healthd/Android.mk`: \n\n ```\n LOCAL_SHARED_LIBRARIES := \\\n android.hardware.configstore@1.0 \\\n android.hardware.configstore-utils \\\n ... (other libraries) \\\n ```"]]