للاستعداد لتنفيذ HAL، يمكنك إنشاء رمز واجهة ConfigStore الأساسي، ثم تعديله لتلبية احتياجاتك.
إنشاء رمز الواجهة
لإنشاء رمز نموذجي للواجهة، شغِّل hidl-gen
.
على سبيل المثال، لإنشاء رمز برمجي لـ surfaceflinger
:
hidl-gen -o hardware/interfaces/configstore/1.0/default \ -Lc++-impl \ -randroid.hardware:hardware/interfaces \ -randroid.hidl:system/libhidl/transport \ android.hardware.config@1.0::ISurfaceFlingerConfigs
تعديل ملف Android.mk
بعد ذلك، عدِّل ملف Android.mk
لإضافة ملف التنفيذ
(<modulename>Configs.cpp
) إلى LOCAL_SRC_FILES
ولربط علامات الإنشاء بتعريفات وحدات الماكرو. على سبيل المثال، يمكنك تعديل
surfaceflinger
في
hardware/interface/configstore/1.0/default/Android.mk
:
LOCAL_SRC_FILES += SurfaceFlingerConfigs.cpp ifneq ($(NUM_FRAMEBUFFER_SURFACE_BUFFERS),) LOCAL_CFLAGS += -DNUM_FRAMEBUFFER_SURFACE_BUFFERS=$(NUM_FRAMEBUFFER_SURFACE_BUFFERS) endif ifeq ($(TARGET_RUNNING_WITHOUT_SYNC_FRAMEWORK),true) LOCAL_CFLAGS += -DRUNNING_WITHOUT_SYNC_FRAMEWORK endif
إذا كان 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 لضبط الإعدادات لا تقرأ
الملفات الخارجية، من المتوقّع أن تكون جاهزة بسرعة بعد تشغيلها.