Com poucas exceções, os pacotes de interface HIDL estão localizados em
hardware/interfaces ou no diretório vendor/. O
nível superior hardware/interfaces é mapeado diretamente para o
namespace do pacote android.hardware. A versão é um subdiretório
no namespace do pacote (não da interface).
O compilador hidl-gen compila os arquivos .hal em
um conjunto de arquivos .h e .cpp. A partir desses arquivos gerados automaticamente, é criada uma biblioteca compartilhada que vincula implementações de cliente/servidor.
O arquivo Android.bp que cria essa biblioteca compartilhada é
gerado automaticamente pelo script
hardware/interfaces/update-makefiles.sh. Sempre que você adicionar um novo pacote a hardware/interfaces ou
adicionar/remover arquivos .hal de/para um pacote existente, será necessário executar
o script novamente para garantir que a biblioteca compartilhada gerada esteja atualizada.
Por exemplo, o arquivo de amostra IFoo.hal precisa estar localizado em
hardware/interfaces/samples/1.0. O arquivo de exemplo
IFoo.hal cria uma interface IFoo no pacote
samples:
package android.hardware.samples@1.0; interface IFoo { struct Foo { int64_t someValue; handle myHandle; }; someMethod() generates (vec<uint32_t>); anotherMethod(Foo foo) generates (int32_t ret); };
Arquivos gerados
Os arquivos gerados automaticamente em um pacote HIDL são vinculados a uma única biblioteca
compartilhada com o mesmo nome do pacote (por exemplo,
[email protected]). A biblioteca compartilhada também exporta um
cabeçalho único, IFoo.h, que pode ser incluído por clientes e
servidores. Usando o compilador hidl-gen com o arquivo de interface IFoo.hal
como entrada, o modo de vinculação tem os seguintes arquivos
gerados automaticamente:

Figura 1. Arquivos gerados pelo compilador.
IFoo.h: descreve a interfaceIFoopura em uma classe C++. Contém os métodos e tipos definidos na interfaceIFoono arquivoIFoo.hal, traduzidos para tipos C++ quando necessário. Não contém detalhes relacionados ao mecanismo de RPC (por exemplo,HwBinder) usado para implementar essa interface. A classe é nomeada com o pacote e a versão, por exemplo,::android::hardware::samples::IFoo::V1_0. Tanto clientes quanto servidores incluem esse cabeçalho: clientes para chamar métodos nele e servidores para implementar esses métodos.IHwFoo.h. Arquivo de cabeçalho que contém declarações de funções que serializam tipos de dados usados na interface. Os desenvolvedores nunca devem incluir o cabeçalho diretamente (ele não contém classes).BpHwFoo.h: uma classe que herda deIFooe descreve a implementação do proxyHwBinder(do lado do cliente) da interface. Os desenvolvedores nunca devem se referir a essa classe diretamente.BnHwFoo.h: uma classe que contém uma referência a uma implementaçãoIFooe descreve a implementação stubHwBinder(do lado do servidor) da interface. Os desenvolvedores não devem se referir a essa classe diretamente.FooAll.cpp: uma classe que contém as implementações do proxyHwBindere do stubHwBinder. Quando um cliente chama um método de interface, o proxy marshala automaticamente os argumentos do cliente e envia a transação para o driver do kernel do binder, que entrega a transação ao stub no outro lado, que chama a implementação real do servidor.
Os arquivos são estruturados de maneira semelhante aos gerados por
aidl-cpp. Para mais detalhes, consulte "Modo de transferência" na
Visão geral do HIDL. O único
arquivo gerado automaticamente que é independente do mecanismo de RPC usado pelo HIDL é
IFoo.h. Todos os outros arquivos estão vinculados ao mecanismo de RPC do HwBinder usado
pelo HIDL. Portanto, as implementações do cliente e do servidor nunca devem
se referir diretamente a nada além de IFoo. Para fazer isso, inclua apenas IFoo.h e vincule à biblioteca compartilhada
gerada.
Link para bibliotecas compartilhadas
Um cliente ou servidor que usa qualquer interface em um pacote precisa incluir a biblioteca compartilhada desse pacote em um (1) dos seguintes locais:
- Em Android.mk:
LOCAL_SHARED_LIBRARIES += android.hardware.samples@1.0
- Em Android.bp:
shared_libs: [ /* ... */ "[email protected]", ],
Outras bibliotecas que você pode precisar incluir:
libhidlbase |
Inclui tipos de dados HIDL padrão. A partir do Android
10, ele também contém todos os símbolos que estavam em
libhidltransport e
libhwbinder.
|
|---|---|
libhidltransport |
Processa o transporte de chamadas HIDL por diferentes mecanismos de RPC/IPC. O Android 10 descontinua essa biblioteca. |
libhwbinder |
Símbolos específicos do Binder. O Android 10 descontinua essa biblioteca. |
libfmq |
IPC de fila de mensagens rápidas. |
Namespaces
Funções e tipos HIDL, como Return<T> e
Void(), são declarados no namespace ::android::hardware.
O namespace C++ de um pacote é determinado pelo nome e pela versão do pacote.
Por exemplo, um pacote mypackage com a versão 1.2 em
hardware/interfaces tem as seguintes qualidades:
- O namespace C++ é
::android::hardware::mypackage::V1_2 - O nome totalmente qualificado de
IMyInterfacenesse pacote é:::android::hardware::mypackage::V1_2::IMyInterface. (IMyInterfaceé um identificador, não faz parte do namespace). - Os tipos definidos no arquivo
types.haldo pacote são identificados como:::android::hardware::mypackage::V1_2::MyPackageType