HAL uygulamasına hazırlanmak için temel ConfigStore arayüz kodu oluşturup bu kodu ihtiyaçlarınıza göre değiştirebilirsiniz.
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
Ardından, uygulama dosyasını (<modulename>Configs.cpp
) LOCAL_SRC_FILES
öğesine 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
değerini 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 (yani surfaceflinger.mk
) taşımayı ve ardından söz konusu dosyayı Android.mk
içinden eklemeyi düşünebilirsiniz.
İş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, hardware/interfaces/configstore/1.0/default/SurfaceFlingerConfigs.cpp
içindeki surfaceflinger
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 (örneğin, HIDL_FETCH_ISurfaceFlingerConfigs
) içermediğinden emin olun. Bu işlev, configstore
tarafından kullanılmayan (ve yasaklanan) HIDL geçiş modu için gereklidir. ConfigStore her zaman birleştirilmiş modda ç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 sağlayın
Bir çerçeve modülünün HAL hizmetine erken erişim elde etmesini 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. Config HAL hizmeti harici dosyaları okumadığı için, kullanıma sunulduktan hemen sonra hazır olması beklenir.