Hizmetin Uygulanması

Koleksiyonlar ile düzeninizi koruyun İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.

HAL uygulamasına hazırlanmak için temel ConfigStore arabirim kodu 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 ortak 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

Ardından, uygulama dosyasını ( <modulename>Configs.cpp ) LOCAL_SRC_FILES ve yapı bayraklarını 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 surfaceflinger yüzey fırlatıcısını 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ı düşünün ve ardından o dosyayı Android.mk .

Uygulama fonksiyonları

HAL'ı uygulayacak işlevleri doldurmak için, _hidl_cb işlevini farklı değerlerle (derleme bayraklarında koşullu) geri çağırın. Örneğin, donanım/interfaces/ surfaceflinger hardware/interfaces/configstore/1.0/default/SurfaceFlingerConfigs.cpp flinger 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 içermediğinden emin olun (örneğin, HIDL_FETCH_ISurfaceFlingerConfigs ). Bu işlev, configstore tarafından kullanılmayan (ve yasaklanan) configstore geçiş modu için gereklidir. ConfigStore her zaman ciltleştirilmiş modda çalışmalıdır.

Hizmet olarak kaydolma

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

Bir çerçeve modülünün HAL hizmetine erken erişebilmesini 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. Yapılandırma HAL hizmeti harici dosyaları okumadığından, başlatıldıktan hemen sonra hazır olması beklenir.