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,
android.hardware.samples@1.0
). 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 interfaceIFoo
pura em uma classe C++. Contém os métodos e tipos definidos na interfaceIFoo
no 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 deIFoo
e 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çãoIFoo
e 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 proxyHwBinder
e 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: [ /* ... */ "android.hardware.samples@1.0", ],
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
IMyInterface
nesse pacote é:::android::hardware::mypackage::V1_2::IMyInterface
. (IMyInterface
é um identificador, não faz parte do namespace). - Os tipos definidos no arquivo
types.hal
do pacote são identificados como:::android::hardware::mypackage::V1_2::MyPackageType