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

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