É 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).