Com poucas exceções, os pacotes de interface HIDL estão localizados em hardware/interfaces ou no diretório vendor/ . O hardware/interfaces mapeia 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 .cpp . A partir desses arquivos gerados automaticamente, uma biblioteca compartilhada com a qual as implementações cliente/servidor se vinculam é construída. O arquivo Android.bp que cria essa biblioteca compartilhada é gerado automaticamente pelo script hardware/interfaces/update-makefiles.sh . Toda 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
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 tem os seguintes arquivos gerados automaticamente:

-
IFoo.h. Descreve a interfaceIFoopura em uma classe C++; ele 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 RPC (por exemplo,HwBinder) usado para implementar essa interface. A classe tem um namespace com o pacote e a versão, por exemplo::android::hardware::samples::IFoo::V1_0. Ambos os clientes e 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 doIFooe descreve a implementação do proxyHwBinder(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ção doIFooe descreve a implementação do stubHwBinder(lado do servidor) da interface. Os desenvolvedores nunca devem se referir a essa classe diretamente. -
FooAll.cpp. Uma classe que contém as implementações para o proxyHwBindere o stubHwBinder. Quando um cliente chama um método de interface, o proxy automaticamente empacota 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 do servidor real).
Os arquivos são estruturados de forma semelhante aos arquivos gerados pelo aidl-cpp (para obter detalhes, consulte "Modo de passagem" 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 se referir diretamente a nada além do IFoo . Para conseguir isso, inclua apenas IFoo.h e vincule-se à 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 | Manipula o transporte de chamadas HIDL em diferentes mecanismos RPC/IPC. O Android 10 preteriu esta biblioteca. |
libhwbinder | Símbolos específicos do fichário. O Android 10 preteriu esta 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 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