Com poucas exceções, os pacotes de interface HIDL estão localizados em
hardware/interfaces
ou o diretório vendor/
. A
hardware/interfaces
mapas de nível superior diretamente para o
Namespace do pacote android.hardware
a versão é um subdiretório
no namespace do pacote (não interface).
O compilador hidl-gen
compila os arquivos .hal
em
um conjunto de arquivos .h
e .cpp
. Desses recursos gerados automaticamente
uma biblioteca compartilhada que as implementações cliente/servidor vinculam.
O arquivo Android.bp
que cria essa biblioteca compartilhada é
gerado automaticamente por hardware/interfaces/update-makefiles.sh
.
script. Sempre que você adicionar um novo pacote a hardware/interfaces
.
adicionar/remover arquivos .hal
de/para um pacote existente, execute novamente
o script para garantir que a biblioteca compartilhada gerada esteja atualizada.
Por exemplo, o arquivo de amostra IFoo.hal
deve estar localizado em
hardware/interfaces/samples/1.0
. O exemplo
O arquivo IFoo.hal
cria uma interface IFoo na
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 um único arquivo compartilhado
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. Como usar o compilador hidl-gen
com o IFoo.hal
de interface de usuário como entrada, o modo binderizado tem o seguinte
arquivos:
Figura 1. Arquivos gerados pelo compilador.
IFoo.h
: Descreve aIFoo
pura em uma classe C++. ela contém os métodos e tipos definidos na InterfaceIFoo
no arquivoIFoo.hal
, traduzido para C++ tipos sempre que necessário. não contém detalhes relacionados à Mecanismo RPC (por exemplo,HwBinder
) usado para implementar essa interface. A classe recebe um namespace com o pacote e a versão, por exemplo,::android::hardware::samples::IFoo::V1_0
: Clientes e servidores inclua este cabeçalho: clientes para chamar métodos nele e servidores para para implementar esses métodos.IHwFoo.h
: Arquivo principal que contém declarações para funções que serializam os tipos de dados usados na interface. Os desenvolvedores nunca devem incluir o cabeçalho diretamente (ele não contém nenhum ).BpHwFoo.h
: Uma classe que herda deIFoo
e descreve o proxyHwBinder
(do lado do cliente) implementação da interface. Os desenvolvedores nunca devem consultar essa classe diretamente.BnHwFoo.h
: Uma classe que contém um referência a uma implementação deIFoo
e descreve Implementação do stubHwBinder
(do lado do servidor) da interface. Os desenvolvedores nunca devem consultar essa classe diretamente.FooAll.cpp
: Uma classe que contém o implementações para os proxiesHwBinder
eHwBinder
. Quando um cliente chama um método de interface, o proxy organiza automaticamente os argumentos do cliente e envia a transação ao driver do kernel do binder, que entrega a transação ao stub da do outro lado (que então chama a implementação real do servidor).
Os arquivos são estruturados de forma semelhante aos arquivos gerados
aidl-cpp
(para mais detalhes, consulte "Modo de passagem" na
Visão geral do HIDL). O único
arquivo gerado automaticamente independente do mecanismo RPC usado pelo HIDL é
IFoo.h
todos os outros arquivos estão vinculados ao mecanismo RPC HwBinder usado
pelo HIDL. Portanto, as implementações de cliente e servidor nunca devem
se referir diretamente a qualquer coisa diferente de IFoo
. Para alcançar
inclua apenas IFoo.h
e inclua um link na imagem
biblioteca.
Link para as bibliotecas compartilhadas
Um cliente ou servidor que usa qualquer interface em um pacote deve incluir as biblioteca compartilhada desse pacote em uma (1) das seguintes opções locais:
- No Android.mk:
LOCAL_SHARED_LIBRARIES += android.hardware.samples@1.0
- No Android.bp:
shared_libs: [ /* ... */ "android.hardware.samples@1.0", ],
Outras bibliotecas que podem ser necessárias para incluir:
libhidlbase |
Inclui tipos de dados HIDL padrão. A partir do Android
10, também contém todos os símbolos anteriormente na
libhidltransport e
libhwbinder .
|
---|---|
libhidltransport |
Gerencia o transporte de chamadas HIDL por diferentes mecanismos RPC/IPC. O Android 10 descontinua essa biblioteca. |
libhwbinder |
Símbolos específicos do binder. Android 10 descontinua essa biblioteca. |
libfmq |
IPC de fila rápida de mensagens. |
Namespaces
funções e tipos de HIDL, como Return<T>
e
Void()
são declarados no namespace ::android::hardware
.
O namespace C++ de um pacote é determinado pelo nome do pacote e pela versão.
Por exemplo, um pacote mypackage com a versão 1.2 nos
hardware/interfaces
tem as seguintes qualidades:
- O namespace C++ é
::android::hardware::mypackage::V1_2
- Nome totalmente qualificado de
IMyInterface
no O pacote é:::android::hardware::mypackage::V1_2::IMyInterface
.IMyInterface
é um identificador, não parte do namespace. - Tipos definidos no arquivo
types.hal
do pacote são identificadas como:::android::hardware::mypackage::V1_2::MyPackageType