Entrega de pacotes

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. A amostra 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:

Arquivos
gerado pelo compilador

Figura 1. Arquivos gerados pelo compilador.

  • IFoo.h: Descreve a IFoo pura em uma classe C++. ela contém os métodos e tipos definidos na Interface IFoo no arquivo IFoo.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 de IFoo e descreve o proxy HwBinder (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 de IFoo e descreve Implementação do stub HwBinder (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 proxies HwBinder e HwBinder. 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.

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