برای آماده شدن برای اجرای HAL، می توانید کد رابط اصلی ConfigStore را ایجاد کنید، سپس آن را برای رفع نیازهای خود تغییر دهید.
کد رابط تولید کنید
برای تولید کد boilerplate برای رابط، 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 فایل های خارجی را نمی خواند، انتظار می رود پس از راه اندازی به سرعت آماده شود.