Puedes actualizar los módulos HAL preexistentes a módulos HAL de HIDL convirtiendo el encabezado en hardware/libhardware/include/hardware
.
Cómo usar c2hal
La herramienta c2hal
se encarga de la mayor parte del trabajo de conversión, lo que reduce la cantidad de cambios manuales necesarios. Por ejemplo, para generar un archivo .hal
de HIDL para el HAL de NFC, haz lo siguiente:
make c2hal
c2hal -r android.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport -p android.hardware.nfc@1.0 hardware/libhardware/include/hardware/nfc.h
Estos comandos agregan archivos en hardware/interfaces/nfc/1.0/
. Ejecutar hardware/interfaces/update-makefiles.sh
desde el directorio $ANDROID_BUILD_TOP
también agrega el archivo makefile requerido a la HAL. Desde aquí, puedes realizar cambios manuales para convertir por completo el HAL.
Actividades de c2hal
Cuando ejecutas c2hal
, todo lo que se encuentra en el archivo de encabezado se transfiere a los archivos .hal
.
c2hal
identifica las structs que contienen punteros de función en el archivo de encabezado proporcionado y convierte cada struct en un archivo de interfaz independiente.
Por ejemplo, alloc_device_t
se convierte en el módulo HAL IAllocDevice
(en el archivo IAllocDevice.hal
).
Todos los demás tipos de datos se copian en un archivo types.hal
.
Las definiciones con signo de libra se mueven a enumeraciones, y los elementos que no forman parte de HIDL o que no se pueden convertir (como las declaraciones de funciones estáticas) se copian en comentarios marcados con el texto "NOTE
".
Actividades manuales
La herramienta c2hal
no sabe qué hacer cuando encuentra ciertas construcciones. Por ejemplo, HIDL no tiene el concepto de punteros sin procesar. Por este motivo, cuando c2hal
encuentra un puntero en los archivos de encabezado, no sabe si el puntero debe interpretarse como un array o como una referencia a otro objeto. Los punteros nulos también son opacos de manera similar.
Los campos como int reserved[7]
se deben quitar manualmente durante la transición a HIDL. Los elementos, como el nombre del valor de devolución, deben actualizarse a algo más significativo; por ejemplo, convertir el parámetro de devolución de métodos como write
en NFC del int32_t write_ret
generado automáticamente a Status status
(donde Status
es un nuevo enum que contiene los posibles estados de NFC).
Implementa el HAL
Después de crear los archivos .hal
para representar tu HAL, debes generar los archivos make (Make o Soong) que crean la compatibilidad con el lenguaje en C++ y Java (a menos que el HAL use una función no compatible con Java). La secuencia de comandos ./hardware/interfaces/update-makefiles.sh
puede generar automáticamente archivos makefile para los HAL ubicados en el directorio hardware/interfaces
(para los HAL en otras ubicaciones, simplemente actualiza la secuencia de comandos).
Cuando los archivos makefile estén actualizados, podrás generar archivos de encabezado y métodos de implementación. Para obtener detalles sobre la implementación de la interfaz generada, consulta HIDL C++ (para implementaciones en C++) o HIDL Java (para implementaciones en Java).