Pacotes

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:

Arquivos gerados pelo compilador

Figura 1. Arquivos gerados pelo compilador
  • IFoo.h . Descreve a interface IFoo pura em uma classe C++; ele 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 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 do IFoo e descreve a implementação do proxy HwBinder (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 do IFoo e descreve a implementação do stub HwBinder (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 proxy HwBinder e o stub HwBinder . 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.

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 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