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.