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, é construída uma biblioteca compartilhada com a qual as implementações cliente/servidor se vinculam. O arquivo Android.bp
que cria esta biblioteca compartilhada é gerado automaticamente pelo script hardware/interfaces/update-makefiles.sh
. Cada vez que você adiciona um novo pacote a hardware/interfaces
ou adiciona/remove arquivos .hal
de/para um pacote existente, você deve executar 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 arquivo IFoo.hal
de amostra cria uma interface IFoo no pacote de amostras :
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 único cabeçalho, 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 binderizado possui os seguintes arquivos gerados automaticamente:
-
IFoo.h
Descreve a interfaceIFoo
pura em uma classe C++; ele 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 RPC (por exemplo,HwBinder
) usado para implementar esta interface. A classe tem o namespace do pacote e da versão, por exemplo::android::hardware::samples::IFoo::V1_0
. Tanto clientes quanto servidores incluem este 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 para funções que serializam tipos de dados usados na interface. Os desenvolvedores nunca devem incluir seu cabeçalho diretamente (ele não contém nenhuma classe). -
BpHwFoo.h
. Uma classe que herda deIFoo
e descreve a implementação do proxyHwBinder
(lado do cliente) da interface. Os desenvolvedores nunca devem consultar esta classe diretamente. -
BnHwFoo.h
. Uma classe que contém uma referência a uma implementaçãoIFoo
e descreve a implementação do stubHwBinder
(lado do servidor) da interface. Os desenvolvedores nunca devem consultar esta 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 empacota automaticamente os argumentos do cliente e envia a transação para o driver do kernel do binder, que entrega a transação ao stub do outro lado (que então chama a implementação real do servidor).
Os arquivos são estruturados de forma semelhante aos arquivos gerados pelo aidl-cpp
(para detalhes, consulte "Modo Passthrough" na Visão Geral do HIDL ). O único arquivo gerado automaticamente que é independente do mecanismo RPC usado pelo HIDL é IFoo.h
; todos os outros arquivos estão vinculados ao mecanismo HwBinder RPC usado pelo HIDL. Portanto, as implementações de cliente e servidor nunca devem referir-se diretamente a nada além de IFoo
. Para conseguir isso, inclua apenas IFoo.h
e vincule à biblioteca compartilhada gerada.
Vinculando a bibliotecas compartilhadas
Um cliente ou servidor que usa qualquer interface em um pacote deve 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", ],
Bibliotecas adicionais que você pode precisar incluir:
libhidlbase | Inclui tipos de dados HIDL padrão. A partir do Android 10, também contém todos os símbolos anteriormente em libhidltransport e libhwbinder . |
---|---|
libhidltransport | Lida com o transporte de chamadas HIDL em diferentes mecanismos RPC/IPC. O Android 10 descontinua esta biblioteca. |
libhwbinder | Símbolos específicos do fichário. O Android 10 descontinua esta biblioteca. |
libfmq | IPC de fila de mensagens rápida. |
Espaços para nome
Funções e tipos HIDL como Return<T>
e Void()
são declarados em namespace ::android::hardware
. O namespace C++ de um pacote é determinado pelo nome e pela versão do pacote. Por exemplo, um pacote mypackage com versão 1.2 em hardware/interfaces
possui 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