Converter módulos HAL

É possível atualizar módulos HAL preexistentes para módulos HAL de HIDL convertendo o cabeçalho em hardware/libhardware/include/hardware.

Usar o c2hal

A ferramenta c2hal processa a maior parte do trabalho de conversão, reduzindo o número de mudanças manuais necessárias. Por exemplo, para gerar um arquivo .hal HIDL para o HAL NFC:

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

Esses comandos adicionam arquivos em hardware/interfaces/nfc/1.0/. A execução de hardware/interfaces/update-makefiles.sh no diretório $ANDROID_BUILD_TOP também adiciona o makefile necessário à HAL. Aqui, você pode fazer mudanças manuais para converter totalmente o HAL.

atividades c2hal

Quando você executa c2hal, tudo no arquivo de cabeçalho é transferido para arquivos .hal.

c2hal identifica structs que contêm ponteiros de função no arquivo de cabeçalho fornecido e converte cada struct em um arquivo de interface separado. Por exemplo, alloc_device_t é convertido no módulo HAL IAllocDevice (no arquivo IAllocDevice.hal).

Todos os outros tipos de dados são copiados para um arquivo types.hal. As definições de libra são movidas para enumerações, e os itens que não fazem parte do HIDL ou não são convertíveis (como declarações de função estática) são copiados para comentários marcados com o texto "NOTE".

Atividades manuais

A ferramenta c2hal não sabe o que fazer quando encontra determinados construtos. Por exemplo, o HIDL não tem o conceito de ponteiros brutos. Por isso, quando c2hal encontra um ponteiro em arquivos de cabeçalho, ele não sabe se o ponteiro precisa ser interpretado como uma matriz ou como uma referência a outro objeto. Os ponteiros nulos também são opacos.

Campos como int reserved[7] precisam ser removidos manualmente durante a transição para HIDL. Itens como o nome do valor de retorno precisam ser atualizados para algo mais significativo. Por exemplo, converta o parâmetro de retorno de métodos como write em NFC do int32_t write_ret gerado automaticamente para Status status (em que Status é um novo tipo enumerado que contém possíveis status de NFC).

Implementar a HAL

Depois de criar arquivos .hal para representar o HAL, é necessário gerar os makefiles (Make ou Soong) que criam o suporte ao idioma em C++ e Java, a menos que o HAL use um recurso sem suporte no Java. O script ./hardware/interfaces/update-makefiles.sh pode gerar automaticamente arquivos de make para HALs localizados no diretório hardware/interfaces. Para HALs em outros locais, basta atualizar o script.

Quando os arquivos de make estiverem atualizados, você poderá gerar arquivos de cabeçalho e implementar métodos. Para detalhes sobre a implementação da interface gerada, consulte HIDL C++ (para implementações em C++) ou HIDL Java (para implementações em Java).