Convierte módulos HAL

Puedes actualizar los módulos de HAL preexistentes a módulos de HAL de HIDL convirtiendo el encabezado en hardware/libhardware/include/hardware.

Usa c2hal

La herramienta c2hal controla 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 necesario al HAL. Desde aquí, puedes realizar cambios manuales para convertir el HAL por completo.

actividades de c2hal

Cuando ejecutas c2hal, todo el contenido del archivo de encabezado se transfiere a los archivos .hal.

c2hal identifica las estructuras que contienen punteros de función en el archivo de encabezado proporcionado y convierte cada estructura 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 de pound se mueven a enums, y los elementos que no forman parte de HIDL o que no son convertibles (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 se encuentra con ciertas construcciones. Por ejemplo, HIDL no tiene el concepto de punteros sin procesar. Debido a esto, cuando c2hal encuentra un puntero en los archivos de encabezado, no sabe si el puntero se debe interpretar 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 de forma manual durante la transición a HIDL. Los elementos como el nombre del valor que se muestra deben actualizarse a algo más significativo; por ejemplo, convertir el parámetro que se muestra de métodos como write en NFC del int32_t write_ret generado automáticamente a Status status (donde Status es una nueva enumeración que contiene posibles estados de NFC).

Implementa el HAL

Después de crear archivos .hal para representar tu HAL, debes generar los archivos de configuración de 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 que se encuentran en el directorio hardware/interfaces (para los HAL que se encuentran en otras ubicaciones, simplemente actualiza la secuencia de comandos).

Cuando los archivos de configuración estén actualizados, estarás listo para generar archivos de encabezado y implementar métodos. Para obtener detalles sobre la implementación de la interfaz generada, consulta HIDL C++ (para implementaciones de C++) o HIDL Java (para implementaciones de Java).