پیاده‌سازی سرویس

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