Hizmeti uygulama

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

Arayüz kodu oluşturun

Arayüz için ortak 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'yi değiştir

Ardından, uygulama dosyasını (<modulename>Configs.cpp) LOCAL_SRC_FILES öğesine 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 değerini 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 (yani surfaceflinger.mk) taşımayı ve ardından söz konusu dosyayı Android.mk içinden eklemeyi düşünebilirsiniz.

İş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, hardware/interfaces/configstore/1.0/default/SurfaceFlingerConfigs.cpp içindeki surfaceflinger işlevlerini 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 (örneğin, HIDL_FETCH_ISurfaceFlingerConfigs) içermediğinden emin olun. Bu işlev, configstore tarafından kullanılmayan (ve yasaklanan) HIDL geçiş modu için gereklidir. ConfigStore her zaman birleştirilmiş modda ç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 sağlayın

Bir çerçeve modülünün HAL hizmetine erken erişim elde etmesini sağlamak için yapılandırma HAL hizmeti, hwservicemanager hazır olduktan hemen sonra mümkün olduğunca erken başlamalıdır. Config HAL hizmeti harici dosyaları okumadığı için, kullanıma sunulduktan hemen sonra hazır olması beklenir.