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.