Você pode atualizar módulos HAL pré-existentes para módulos HIDL HAL convertendo o cabeçalho em hardware/libhardware/include/hardware
.
Usando c2hal
A ferramenta c2hal
cuida da maior parte do trabalho de conversão, reduzindo o número de alterações manuais necessárias. Por exemplo, para gerar um arquivo HIDL .hal
para o 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
Esses comandos adicionam arquivos em hardware/interfaces/nfc/1.0/
. Executar hardware/interfaces/update-makefiles.sh
no diretório $ANDROID_BUILD_TOP também adicionará o makefile necessário ao HAL. A partir daqui, você pode fazer alterações manuais para converter totalmente o HAL.
atividades c2hal
Quando você executa c2hal
, tudo no arquivo de cabeçalho é transferido para arquivos .hal
.
c2hal
identifica estruturas que contêm ponteiros de função no arquivo de cabeçalho fornecido e converte cada estrutura em um arquivo de interface separado. Por exemplo, alloc_device_t
é convertido no módulo IAllocDevice
HAL (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 enums, e os itens que não fazem parte do HIDL ou não são conversíveis (como declarações de função estática) são copiados em comentários marcados com o texto " NOTE
".
Atividades manuais
A ferramenta c2hal
não sabe o que fazer quando encontra certas construções. Por exemplo, HIDL não tem conceito de ponteiros brutos; por causa disso, quando c2hal
encontra um ponteiro em arquivos de cabeçalho, ele não sabe se o ponteiro deve ser interpretado como um array ou como uma referência a outro objeto. Os ponteiros vazios também são igualmente opacos.
Campos como int reserved[7]
devem ser removidos manualmente durante a transição para HIDL. Itens como o nome do valor retornado devem ser atualizados para algo mais significativo; por exemplo, convertendo o parâmetro de retorno de métodos como write
em NFC do int32_t write_ret
gerado automaticamente para Status status
(onde Status
é uma nova enumeração contendo possíveis status de NFC).
Implementando o HAL
Depois de criar arquivos .hal
para representar seu HAL, você deve gerar os makefiles (Make ou Soong) que criam o suporte à linguagem em C++ e Java (a menos que o HAL use um recurso não suportado em Java). O script ./hardware/interfaces/update-makefiles.sh
pode gerar automaticamente makefiles para HALs localizados no diretório hardware/interfaces
(para HALs em outros locais, basta atualizar o script).
Quando os makefiles estiverem atualizados, você estará pronto para gerar arquivos de cabeçalho e implementar métodos. Para obter detalhes sobre a implementação da interface gerada, consulte HIDL C++ (para implementações C++) ou HIDL Java (para implementações Java).