Pacotes

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:

Arquivos
gerados pelo compilador

Figura 1. Arquivos gerados pelo compilador.

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

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