Conversión de módulos HAL

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

usando c2hal

La herramienta c2hal maneja la mayor parte del trabajo de conversión, reduciendo la cantidad de cambios manuales necesarios. Por ejemplo, para generar un archivo HIDL .hal para NFC HAL:

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 agregará el archivo MAKE requerido a HAL. Desde aquí, puede realizar cambios manuales para convertir completamente el HAL.

actividades c2hal

Cuando ejecuta c2hal , todo en el archivo de encabezado se transfiere a 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 almohadilla 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 concepto de punteros sin procesar; Debido a esto, cuando c2hal encuentra un puntero en los archivos de encabezado, no sabe si el puntero debe interpretarse como una matriz o como una referencia a otro objeto. Los punteros vacíos también son igualmente opacos.

Los campos como int reserved[7] deben eliminarse manualmente durante la transición a HIDL. Elementos como el nombre del valor devuelto deben actualizarse a algo más significativo; por ejemplo, convertir el parámetro de retorno de métodos como write en NFC desde el int32_t write_ret autogenerado al Status status (donde Status es una nueva enumeración que contiene posibles estados de NFC).

Implementando el HAL

Una vez que haya creado los archivos .hal para representar su HAL, debe generar los archivos MAKE (Make o Soong) que crean la compatibilidad con el lenguaje en C++ y Java (a menos que HAL use una función no admitida en Java). El script ./hardware/interfaces/update-makefiles.sh puede generar automáticamente makefiles para HAL ubicados en el directorio hardware/interfaces (para HAL en otras ubicaciones, simplemente actualice el script).

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