Hizmetin Uygulanması

HAL uygulamasına hazırlanmak için temel ConfigStore arayüz kodunu oluşturabilir ve ardından bunu ihtiyaçlarınızı karşılayacak şekilde değiştirebilirsiniz.

Arayüz kodu oluşturuluyor

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

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ştirme

Daha sonra, uygulama dosyasını ( <modulename>Configs.cpp ) LOCAL_SRC_FILES eklemek ve yapı bayraklarını makro tanımlarıyla eşlemek için Android.mk dosyasını değiştirin. Örneğin, surfaceflinger hardware/interface/configstore/1.0/default/Android.mk konumunda 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şımayı ve ardından bu dosyayı Android.mk eklemeyi düşünün.

İşlevlerin uygulanması

HAL'yi uygulamaya yönelik işlevleri doldurmak için, _hidl_cb işlevini farklı değerlerle (derleme bayraklarına göre koşullandırılmış) geri çağırın. Örneğin, surfaceflinger işlevlerini hardware/interfaces/configstore/1.0/default/SurfaceFlingerConfigs.cpp dosyasında 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 (örneğin, HIDL_FETCH_ISurfaceFlingerConfigs ) adlı bir işlev 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 ciltlenmiş modda çalışmalıdır.

Hizmet olarak kaydolma

Son olarak, tüm arayüz uygulamalarını configstore servisine kaydedin. Örneğin, surfaceflinger uygulamalarını hardware/interfaces/configstore/1.0/default/service.cpp 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şimin sağlanması

Bir çerçeve modülünün HAL hizmetine erken erişebilmesini sağlamak için, config HAL hizmeti hwservicemanager hazır olduktan hemen sonra mümkün olduğu kadar erken başlamalıdır. Config HAL hizmeti harici dosyaları okumadığından, başlatıldıktan hemen sonra hazır olması beklenir.