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.