اعتبارًا من 27 آذار (مارس) 2025، ننصحك باستخدام android-latest-release بدلاً من aosp-main لإنشاء AOSP والمساهمة فيه. لمزيد من المعلومات، يُرجى الاطّلاع على التغييرات في AOSP.
بعد ذلك، عدِّل ملف Android.mk لإضافة ملف التنفيذ
(<modulename>Configs.cpp) إلى LOCAL_SRC_FILES
ولربط علامات الإنشاء بتعريفات وحدات الماكرو. على سبيل المثال، يمكنك تعديل
surfaceflinger في
hardware/interface/configstore/1.0/default/Android.mk:
إذا كان Android.mk يتضمّن عدة مجموعات ifeq-endif،
ننصحك بنقل الرمز إلى ملف جديد (أي
surfaceflinger.mk)، ثم تضمين هذا الملف من
Android.mk.
تنفيذ الدوالّ
لملء الدوالّ لتنفيذ HAL، استدِع الدالة
_hidl_cb بقيم مختلفة (شرطًا على build
flags). على سبيل المثال، يمكنك ملء دوال surfaceflinger
في
hardware/interfaces/configstore/1.0/default/SurfaceFlingerConfigs.cpp:
Return<void> SurfaceFlingerConfigs::numFramebufferSurfaceBuffers(
numFramebufferSurfaceBuffers_cb _hidl_cb) {
#if NUM_FRAMEBUFFER_SURFACE_BUFFERS 2
_hidl_cb(NumBuffers.TWO);
#else if NUM_FRAMEBUFFER_SURFACE_BUFFERS 3
_hidl_cb(NumBuffers.THREE);
#else
_hidl_cb(NumBuffers.USE_DEFAULT);
#endif
}
Return<void> SurfaceFlingerConfigs::runWithoutSyncFramework(
runWithoutSyncFramework_cb _hidl_cb) {
#ifdef RUNNING_WITHOUT_SYNC_FRAMEWORK
_hidl_cb({true /* specified */, true /* value */});
#else
// when macro not defined, we can give any value to the second argument.
// It will simply be ignored in the framework side.
_hidl_cb({false /* specified */, false /* value */});
#endif
}
تأكَّد من أنّ عملية التنفيذ لا تحتوي على دالة باسم
HIDL_FETCH_interface-name (على سبيل المثال،
HIDL_FETCH_ISurfaceFlingerConfigs). هذه الدالة مطلوبة ليعمل
وضع HIDL للنقل المباشر، وهو غير مستخدَم (ومحظور) من قِبل
configstore. يجب تشغيل ConfigStore دائمًا في وضع الربط.
التسجيل كخدمة
أخيرًا، سجِّل جميع عمليات تنفيذ الواجهات في خدمة
configstore. على سبيل المثال، يمكنك تسجيل عمليات تنفيذ
surfaceflinger في
hardware/interfaces/configstore/1.0/default/service.cpp:
configureRpcThreadpool(maxThreads, true);
sp<ISurfaceFlingerConfigs> surfaceFlingerConfigs = new SurfaceFlingerConfigs;
status_t status = surfaceFlingerConfigs->registerAsService();
sp<IBluetoothConfigs> bluetoothConfigs = new BluetoothConfigs;
status = bluetoothConfigs->registerAsService();
// register more interfaces here
joinRpcThreadpool();
ضمان إمكانية الوصول المبكر
لضمان حصول وحدة إطار العمل على إذن بالوصول المبكر إلى خدمة HAL، يجب بدء
خدمة HAL للإعداد في أقرب وقت ممكن، بعد أن يصبح
hwservicemanager جاهزًا. بما أنّ خدمة HAL لضبط الإعدادات لا تقرأ
الملفات الخارجية، من المتوقّع أن تكون جاهزة بسرعة بعد تشغيلها.
يخضع كل من المحتوى وعيّنات التعليمات البرمجية في هذه الصفحة للتراخيص الموضحّة في ترخيص استخدام المحتوى. إنّ Java وOpenJDK هما علامتان تجاريتان مسجَّلتان لشركة Oracle و/أو الشركات التابعة لها.
تاريخ التعديل الأخير: 2025-07-26 (حسب التوقيت العالمي المتفَّق عليه)
[[["يسهُل فهم المحتوى.","easyToUnderstand","thumb-up"],["ساعَدني المحتوى في حلّ مشكلتي.","solvedMyProblem","thumb-up"],["غير ذلك","otherUp","thumb-up"]],[["لا يحتوي على المعلومات التي أحتاج إليها.","missingTheInformationINeed","thumb-down"],["الخطوات معقدة للغاية / كثيرة جدًا.","tooComplicatedTooManySteps","thumb-down"],["المحتوى قديم.","outOfDate","thumb-down"],["ثمة مشكلة في الترجمة.","translationIssue","thumb-down"],["مشكلة في العيّنات / التعليمات البرمجية","samplesCodeIssue","thumb-down"],["غير ذلك","otherDown","thumb-down"]],["تاريخ التعديل الأخير: 2025-07-26 (حسب التوقيت العالمي المتفَّق عليه)"],[],[],null,["# Implement the service\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\nTo prepare for the HAL implementation, you can generate basic ConfigStore\ninterface code, then modify it to meet your needs.\n\nGenerate interface code\n-----------------------\n\nTo generate boilerplate code for the interface, run `hidl-gen`.\nFor example, to generate code for `surfaceflinger`: \n\n```\nhidl-gen -o hardware/interfaces/configstore/1.0/default \\\n -Lc++-impl \\\n -randroid.hardware:hardware/interfaces \\\n -randroid.hidl:system/libhidl/transport \\\n android.hardware.config@1.0::ISurfaceFlingerConfigs\n```\n| **Note:** Don't run `hidl-gen` with `-Landroidbp-impl` as this generates `Android.bp`. The module must be built with `Android.mk` to access build flags.\n\nModify Android.mk\n-----------------\n\nNext, modify the `Android.mk` file to add the implementation file\n(`\u003cmodulename\u003eConfigs.cpp`) to `LOCAL_SRC_FILES` and\nto map build flags into macro definitions. For example, you can modify\n`surfaceflinger` in\n`hardware/interface/configstore/1.0/default/Android.mk`: \n\n```\nLOCAL_SRC_FILES += SurfaceFlingerConfigs.cpp\nifneq ($(NUM_FRAMEBUFFER_SURFACE_BUFFERS),)\n LOCAL_CFLAGS += -DNUM_FRAMEBUFFER_SURFACE_BUFFERS=$(NUM_FRAMEBUFFER_SURFACE_BUFFERS)\nendif\n\nifeq ($(TARGET_RUNNING_WITHOUT_SYNC_FRAMEWORK),true)\n LOCAL_CFLAGS += -DRUNNING_WITHOUT_SYNC_FRAMEWORK\nendif\n```\n\nIf `Android.mk` includes several `ifeq-endif` blocks,\nconsider moving your code into a new file (that is,\n`surfaceflinger.mk`) then include that file from\n`Android.mk`.\n\nImplement functions\n-------------------\n\nTo fill the functions to implement the HAL, call back the\n`_hidl_cb` function with different values (conditioned on build\nflags). For example, you can fill the functions for `surfaceflinger`\nin\n`hardware/interfaces/configstore/1.0/default/SurfaceFlingerConfigs.cpp`: \n\n```\nReturn\u003cvoid\u003e SurfaceFlingerConfigs::numFramebufferSurfaceBuffers(\n numFramebufferSurfaceBuffers_cb _hidl_cb) {\n #if NUM_FRAMEBUFFER_SURFACE_BUFFERS 2\n _hidl_cb(NumBuffers.TWO);\n #else if NUM_FRAMEBUFFER_SURFACE_BUFFERS 3\n _hidl_cb(NumBuffers.THREE);\n #else\n _hidl_cb(NumBuffers.USE_DEFAULT);\n #endif\n}\n\nReturn\u003cvoid\u003e SurfaceFlingerConfigs::runWithoutSyncFramework(\n runWithoutSyncFramework_cb _hidl_cb) {\n #ifdef RUNNING_WITHOUT_SYNC_FRAMEWORK\n _hidl_cb({true /* specified */, true /* value */});\n #else\n // when macro not defined, we can give any value to the second argument.\n // It will simply be ignored in the framework side.\n _hidl_cb({false /* specified */, false /* value */});\n #endif\n}\n```\n\nEnsure that the implementation doesn't contain a function named\n`HIDL_FETCH_`\u003cvar translate=\"no\"\u003einterface-name\u003c/var\u003e (for example,\n`HIDL_FETCH_ISurfaceFlingerConfigs`). This function is needed for\nHIDL passthrough mode, which is unused (and prohibited) by\n`configstore`. ConfigStore must always run in binderized mode.\n\nRegister as a service\n---------------------\n\nFinally, register all interface implementations to the\n`configstore` service. For example, you can register\n`surfaceflinger` implementations in\n`hardware/interfaces/configstore/1.0/default/service.cpp`: \n\n```\nconfigureRpcThreadpool(maxThreads, true);\nsp\u003cISurfaceFlingerConfigs\u003e surfaceFlingerConfigs = new SurfaceFlingerConfigs;\nstatus_t status = surfaceFlingerConfigs-\u003eregisterAsService();\n\nsp\u003cIBluetoothConfigs\u003e bluetoothConfigs = new BluetoothConfigs;\nstatus = bluetoothConfigs-\u003eregisterAsService();\n\n// register more interfaces here\njoinRpcThreadpool();\n```\n\nEnsure early access\n-------------------\n\nTo ensure that a framework module can get early access the HAL service, the\nconfig HAL service should start as early as possible, just after\n`hwservicemanager` is ready. As the config HAL service doesn't read\nexternal files, it's expected to be ready quickly after it's launched."]]