HAL uygulamasına hazırlanmak için temel ConfigStore arayüz kodunu 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 standart 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
Daha sonra, uygulama dosyasını ( <modulename>Configs.cpp
) LOCAL_SRC_FILES
eklemek ve yapı bayraklarını makro tanımlarıyla eşlemek için Android.mk
dosyasını değiştirin. Örneğin, surfaceflinger
hardware/interface/configstore/1.0/default/Android.mk
konumunda 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ı ve ardından bu dosyayı Android.mk
eklemeyi düşünün.
İşlevlerin uygulanması
HAL'yi uygulamaya yönelik işlevleri doldurmak için, _hidl_cb
işlevini farklı değerlerle (derleme bayraklarına göre koşullandırılmış) geri çağırın. Örneğin, surfaceflinger
işlevlerini hardware/interfaces/configstore/1.0/default/SurfaceFlingerConfigs.cpp
dosyasında 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
(örneğin, HIDL_FETCH_ISurfaceFlingerConfigs
) adlı bir işlev 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 ciltlenmiş modda çalışmalıdır.
Hizmet olarak kaydolma
Son olarak, tüm arayüz uygulamalarını configstore
servisine kaydedin. Örneğin, surfaceflinger
uygulamalarını hardware/interfaces/configstore/1.0/default/service.cpp
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, config HAL hizmeti hwservicemanager
hazır olduktan hemen sonra mümkün olduğu kadar erken başlamalıdır. Config HAL hizmeti harici dosyaları okumadığından, başlatıldıktan hemen sonra hazır olması beklenir.