Cómo convertir módulos de HAL

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

Usar c2hal

El c2hal La herramienta se encarga de la mayor parte del trabajo de conversión, lo que reduce la cantidad de tareas manuales requeridas. cambios. Por ejemplo, para generar un archivo HIDL .hal para el 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/. Correr hardware/interfaces/update-makefiles.sh desde $ANDROID_BUILD_TOP también agrega el archivo makefile requerido a la HAL. Desde aquí, puedes Realiza cambios manuales para convertir por completo la HAL.

Actividades C2hal

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

c2hal identifica las structs que contienen punteros de función en la proporcionado y convierte cada struct en un archivo de interfaz independiente. Por ejemplo, alloc_device_t se convierte en la IAllocDevice módulo de HAL (en el archivo IAllocDevice.hal).

Todos los demás tipos de datos se copian en un archivo types.hal. Las definiciones de libra se mueven a enumeraciones y los elementos que no forman parte de HIDL o no. convertibles (como declaraciones de funciones estáticas) se copian en los comentarios. marcados con el texto "NOTE".

Actividades manuales

La herramienta c2hal no sabe qué hacer cuando se encuentra 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 si el puntero debe interpretarse como un array o como una referencia a otro objeto. Los punteros vacíos también son igualmente opacos.

Los campos como int reserved[7] deben quitarse manualmente durante la transición a HIDL. Los elementos como el nombre del valor que se devuelve deben ser se actualicen a algo más significativo; por ejemplo, convertir el valor parámetro de métodos como write en NFC de la API de int32_t write_ret a Status status (donde Status es una nueva enumeración que contiene posibles estados de NFC).

Implementa la HAL

Después de crear archivos .hal para representar tu HAL, haz lo siguiente: debe generar los archivos makefile (Make o Soong) que crean el lenguaje compatible en C++ y Java (a menos que la HAL use una función no compatible con Java). El ./hardware/interfaces/update-makefiles.sh secuencia de comandos puede generar archivos makefile para HALs ubicados en hardware/interfaces (para las HAL de otras ubicaciones, solo debes actualizar la secuencia de comandos).

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