Para prepararse para la implementación de HAL, puede generar un código de interfaz básico de ConfigStore y luego modificarlo para satisfacer sus necesidades.
Generación de código de interfaz
Para generar código repetitivo para la interfaz, ejecute hidl-gen
. Por ejemplo, para generar código para surfaceflinger
:
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
Modificar Android.mk
A continuación, modifique el archivo Android.mk
para agregar el archivo de implementación ( <modulename>Configs.cpp
) a LOCAL_SRC_FILES
y para asignar indicadores de compilación en definiciones de macro. Por ejemplo, puede modificar surfaceflinger
en hardware/interface/configstore/1.0/default/Android.mk
:
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
Si Android.mk
incluye varios bloques ifeq-endif
, considere mover su código a un archivo nuevo (es decir, surfaceflinger.mk
) y luego incluya ese archivo desde Android.mk
.
Funciones de implementación
Para completar las funciones para implementar la HAL, devuelva la llamada a la función _hidl_cb
con diferentes valores (condicionados a indicadores de compilación). Por ejemplo, puede completar las funciones para surfaceflinger
en hardware/interfaces/configstore/1.0/default/SurfaceFlingerConfigs.cpp
:
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 }
Asegúrese de que la implementación no contenga una función denominada HIDL_FETCH_ interface-name
(por ejemplo, HIDL_FETCH_ISurfaceFlingerConfigs
). Esta función es necesaria para el modo de transferencia HIDL, que configstore
no usa (y prohíbe). ConfigStore siempre debe ejecutarse en modo enlazado.
Registrarse como un servicio
Finalmente, registre todas las implementaciones de interfaz en el servicio configstore
. Por ejemplo, puede registrar implementaciones de surfaceflinger
en hardware/interfaces/configstore/1.0/default/service.cpp
:
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();
Garantizar el acceso anticipado
Para asegurarse de que un módulo de marco pueda obtener acceso anticipado al servicio HAL, el servicio HAL de configuración debe iniciarse lo antes posible, justo después de que hwservicemanager
esté listo. Como el servicio config HAL no lee archivos externos, se espera que esté listo rápidamente después de su lanzamiento.