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, é 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:

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 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 de IFoo e descreve a implementação do proxy HwBinder (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ção IFoo e descreve a implementação do stub HwBinder (lado do servidor) da interface. Os desenvolvedores nunca devem consultar esta 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 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.

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