Hizmeti uygulama

.

HAL uygulamasına hazırlanmak için temel ConfigStore oluşturabilirsiniz ve ihtiyaçlarınıza göre değiştirmeniz gerekir.

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

Sonra, uygulama dosyasını eklemek için Android.mk dosyasını değiştirin (<modulename>Configs.cpp) - LOCAL_SRC_FILES ve derleme işaretlerini makro tanımlarla eşlemek için kullanılır. Örneğin, surfaceflinger inç 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 birden fazla ifeq-endif bloğu içeriyorsa kodunuzu yeni bir dosyaya (yani, surfaceflinger.mk), ardından bu dosyayı Android.mk

İşlevleri uygulama

HAL'yi uygulama işlevlerini doldurmak için Farklı değerlere sahip _hidl_cb işlevi (derlemeye göre koşullandırılmış) bayrakları) tıklayın. Örneğin, surfaceflinger için işlevleri doldurabilirsiniz bir listesini oluştur: 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
}

Uygulamanın şu adında bir işlev içermediğinden emin olun: HIDL_FETCH_interface-name (örneğin, HIDL_FETCH_ISurfaceFlingerConfigs) tıklayın. Bu işlev, tarafından kullanılmayan (ve yasaklanan) HIDL geçiş modu configstore. ConfigStore her zaman birleştirilmiş modda çalışmalıdır.

Hizmet olarak kaydolun

Son olarak, tüm arayüz uygulamalarını configstore hizmeti. Örneğin, Google Haberler'de surfaceflinger uygulama 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();

Erken erişim sağlayın

Bir çerçeve modülünün HAL hizmetine erken erişim imkanı sağlamak için config HAL hizmeti mümkün olan en kısa sürede, hemen sonra başlamalıdır hwservicemanager hazır. Yapılandırma HAL hizmeti hazır olduğunda, hemen hazır olması beklenir.