Convierte módulos HAL

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).