Hizmeti uygulama

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

Arayüz kodu oluşturma

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

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, Android.mk dosyasını değiştirerek uygulama dosyasını (<modulename>Configs.cpp) LOCAL_SRC_FILES'ye ekleyin ve derleme işaretlerini makro tanımlarına eşleyin. Örneğin, surfaceflinger içinde hardware/interface/configstore/1.0/default/Android.mk öğ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 birden fazla ifeq-endif bloğu içeriyorsa kodunuzu yeni bir dosyaya (ör. surfaceflinger.mk) taşıyıp bu dosyayı Android.mk'dan ekleyebilirsiniz.

İşlevleri uygulama

HAL'yi uygulamak için işlevleri doldurmak üzere _hidl_cb işlevini farklı değerlerle (derleme işaretlerine bağlı olarak) 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 emin olun (örneğin, HIDL_FETCH_ISurfaceFlingerConfigs). Bu işlev, configstore tarafından kullanılmayan (ve yasaklanan) HIDL geçiş modu için gereklidir. ConfigStore her zaman bağlayıcı modda çalışmalıdır.

Hizmet olarak kaydolma

Son olarak, tüm arayüz uygulamalarını configstore hizmetine kaydedin. Örneğin, surfaceflinger uygulamalarını hardware/interfaces/configstore/1.0/default/service.cpp içinde 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şimi etkinleştirme

Bir çerçeve modülünün HAL hizmetine erken erişebilmesi 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 başlatıldıktan kısa süre sonra hazır olması beklenir.