HAL uygulamasına hazırlanmak için temel ConfigStore arayüz kodu oluşturabilir ve ardından bu kodu ihtiyaçlarınıza göre değiştirebilirsiniz.
Arayüz kodu oluşturma
Arayüz için şablon kod oluşturmak üzere hidl-gen
komutunu çalıştırın.
Örneğin, surfaceflinger
için kod oluşturmak istiyorsanız:
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, uygulama dosyasını (<modulename>Configs.cpp
) LOCAL_SRC_FILES
dosyasına eklemek ve derleme işaretlerini 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
içindeki surfaceflinger
öğ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
, birkaç ifeq-endif
bloğu içeriyorsa kodunuzu yeni bir dosyaya (yani surfaceflinger.mk
) taşıyıp bu dosyayı Android.mk
'ten ekleyebilirsiniz.
İşlevleri uygulama
HAL'yi uygulama işlevlerini doldurmak için _hidl_cb
işlevini farklı değerlerle (derleme işaretleriyle koşullandırılır) 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 (örneğin, HIDL_FETCH_ISurfaceFlingerConfigs
) emin olun. Bu işlev, configstore
tarafından kullanılmayan (ve yasaklanan) HIDL geçiş modu için gereklidir. ConfigStore her zaman bağlayıcı modunda çalışmalıdır.
Hizmet olarak kaydolun
Son olarak, tüm arayüz uygulamalarını configstore
hizmetine kaydedin. Örneğin, hardware/interfaces/configstore/1.0/default/service.cpp
içindeki 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şim elde edin
Bir çerçeve modülünün HAL hizmetine erken erişim elde edebilmesi 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, kullanıma sunulduktan sonra hızlı bir şekilde hazır olması beklenir.