Paquetes

Con pocas excepciones, los paquetes de interfaz HIDL se encuentran en hardware/interfaces o en el directorio vendor/ . El hardware/interfaces de nivel superior se asigna directamente al espacio de nombres del paquete android.hardware ; la versión es un subdirectorio bajo el espacio de nombres del paquete (no de la interfaz).

El compilador hidl-gen compila los archivos .hal en un conjunto de archivos .h y .cpp . A partir de estos archivos generados automáticamente se construye una biblioteca compartida con la que se vinculan las implementaciones cliente/servidor. El archivo Android.bp que crea esta biblioteca compartida se genera automáticamente mediante el script hardware/interfaces/update-makefiles.sh . Cada vez que agrega un nuevo paquete a hardware/interfaces , o agrega/elimina archivos .hal a/de un paquete existente, debe volver a ejecutar el script para asegurarse de que la biblioteca compartida generada esté actualizada.

Por ejemplo, el archivo de muestra IFoo.hal debe ubicarse en hardware/interfaces/samples/1.0 . El archivo IFoo.hal de muestra crea una interfaz IFoo en el paquete de ejemplos :

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);
};

Archivos generados

Los archivos generados automáticamente en un paquete HIDL están vinculados a una única biblioteca compartida con el mismo nombre que el paquete (por ejemplo, android.hardware.samples@1.0 ). La biblioteca compartida también exporta un único encabezado, IFoo.h , que pueden incluir clientes y servidores. Usando el compilador hidl-gen con el archivo de interfaz IFoo.hal como entrada, el modo enlazado tiene los siguientes archivos generados automáticamente:

Archivos generados por el compilador.

Figura 1. Archivos generados por el compilador
  • IFoo.h Describe la interfaz IFoo pura en una clase C++; contiene los métodos y tipos definidos en la interfaz IFoo en el archivo IFoo.hal , traducidos a tipos C++ cuando sea necesario. No contiene detalles relacionados con el mecanismo RPC (por ejemplo, HwBinder ) utilizado para implementar esta interfaz. La clase tiene un espacio de nombres con el paquete y la versión, por ejemplo, ::android::hardware::samples::IFoo::V1_0 . Tanto los clientes como los servidores incluyen este encabezado: Clientes para llamar a métodos y servidores para implementar esos métodos.
  • IHwFoo.h . Archivo de encabezado que contiene declaraciones para funciones que serializan los tipos de datos utilizados en la interfaz. Los desarrolladores nunca deben incluir su encabezado directamente (no contiene ninguna clase).
  • BpHwFoo.h . Una clase que hereda de IFoo y describe la implementación del proxy HwBinder (del lado del cliente) de la interfaz. Los desarrolladores nunca deben hacer referencia a esta clase directamente.
  • BnHwFoo.h . Una clase que contiene una referencia a una implementación IFoo y describe la implementación del código auxiliar HwBinder (del lado del servidor) de la interfaz. Los desarrolladores nunca deben hacer referencia a esta clase directamente.
  • FooAll.cpp . Una clase que contiene las implementaciones tanto para el proxy HwBinder como para el código auxiliar HwBinder . Cuando un cliente llama a un método de interfaz, el proxy reúne automáticamente los argumentos del cliente y envía la transacción al controlador del núcleo del enlazador, que entrega la transacción al código auxiliar del otro lado (que luego llama a la implementación real del servidor).

Los archivos están estructurados de manera similar a los archivos generados por aidl-cpp (para obtener más detalles, consulte "Modo Passthrough" en la descripción general de HIDL ). El único archivo generado automáticamente que es independiente del mecanismo RPC utilizado por HIDL es IFoo.h ; todos los demás archivos están vinculados al mecanismo HwBinder RPC utilizado por HIDL. Por lo tanto, las implementaciones de cliente y servidor nunca deben hacer referencia directa a nada que no sea IFoo . Para lograr esto, incluya solo IFoo.h y vincúlelo a la biblioteca compartida generada.

Un cliente o servidor que utiliza cualquier interfaz en un paquete debe incluir la biblioteca compartida de ese paquete en una (1) de las siguientes ubicaciones:

  • En Android.mk :
    LOCAL_SHARED_LIBRARIES += android.hardware.samples@1.0
    
  • En Android.bp :
    shared_libs: [
        /* ... */
        "android.hardware.samples@1.0",
    ],
    

Bibliotecas adicionales que quizás necesites incluir:

libhidlbase Incluye tipos de datos HIDL estándar. A partir de Android 10, esto también contiene todos los símbolos que anteriormente estaban en libhidltransport y libhwbinder .
libhidltransport Maneja el transporte de llamadas HIDL a través de diferentes mecanismos RPC/IPC. Android 10 deja obsoleta esta biblioteca.
libhwbinder Símbolos específicos de carpetas. Android 10 deja obsoleta esta biblioteca.
libfmq Cola de mensajes rápida IPC.

Espacios de nombres

Las funciones y tipos HIDL como Return<T> y Void() se declaran en el espacio de nombres ::android::hardware . El espacio de nombres C++ de un paquete está determinado por el nombre y la versión del paquete. Por ejemplo, un paquete mypackage con la versión 1.2 en hardware/interfaces tiene las siguientes cualidades:

  • El espacio de nombres de C++ es ::android::hardware::mypackage::V1_2
  • El nombre completo de IMyInterface en ese paquete es: ::android::hardware::mypackage::V1_2::IMyInterface . ( IMyInterface es un identificador, no forma parte del espacio de nombres).
  • Los tipos definidos en el archivo types.hal del paquete se identifican como: ::android::hardware::mypackage::V1_2::MyPackageType