Hizmeti uygulama

HAL uygulamasına hazırlanmak için temel ConfigStore arayüz kodu oluşturabilir ve ardından bu kodu ihtiyaçlarınıza göre değiştirebilirsiniz.

Arayüz kodu oluşturma

Arayüz için şablon kod oluşturmak üzere hidl-gen komutunu çalıştırın. Örneğin, surfaceflinger için kod oluşturmak istiyorsanız:

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 dosyasını değiştirme

Ardından, uygulama dosyasını (<modulename>Configs.cpp) LOCAL_SRC_FILES dosyasına eklemek ve derleme işaretlerini makro tanımlarıyla eşlemek için Android.mk dosyasını değiştirin. Örneğin, hardware/interface/configstore/1.0/default/Android.mk içindeki surfaceflinger öğesini değiştirebilirsiniz:

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, birkaç ifeq-endif bloğu içeriyorsa kodunuzu yeni bir dosyaya (yani surfaceflinger.mk) taşıyıp bu dosyayı Android.mk'ten ekleyebilirsiniz.

İşlevleri uygulama

HAL'yi uygulama işlevlerini doldurmak için _hidl_cb işlevini farklı değerlerle (derleme işaretleriyle koşullandırılır) geri çağırın. Örneğin, surfaceflinger in hardware/interfaces/configstore/1.0/default/SurfaceFlingerConfigs.cpp işlevlerini şu şekilde doldurabilirsiniz:

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
}

Uygulamanın HIDL_FETCH_interface-name adlı bir işlev içermediğinden (örneğin, HIDL_FETCH_ISurfaceFlingerConfigs) emin olun. Bu işlev, configstore tarafından kullanılmayan (ve yasaklanan) HIDL geçiş modu için gereklidir. ConfigStore her zaman bağlayıcı modunda çalışmalıdır.

Hizmet olarak kaydolun

Son olarak, tüm arayüz uygulamalarını configstore hizmetine kaydedin. Örneğin, hardware/interfaces/configstore/1.0/default/service.cpp içindeki surfaceflinger uygulamalarını kaydedebilirsiniz:

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();

Erken erişim elde edin

Bir çerçeve modülünün HAL hizmetine erken erişim elde edebilmesi için yapılandırma HAL hizmeti, hwservicemanager hazır olduktan hemen sonra mümkün olduğunca erken başlatılmalıdır. Yapılandırma HAL hizmeti harici dosyaları okumadığından, kullanıma sunulduktan sonra hızlı bir şekilde hazır olması beklenir.