برای آمادهسازی پیادهسازی 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 را با مقادیر مختلف (با توجه به پرچمهای ساخت) فراخوانی کنید. برای مثال، میتوانید توابع مربوط به 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 همیشه باید در حالت binderized اجرا شود.
ثبت نام به عنوان سرویس
در نهایت، تمام پیادهسازیهای رابط را در سرویس 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 فایلهای خارجی را نمیخوانند، انتظار میرود پس از راهاندازی، به سرعت آماده شود.