Paquetes

Con pocas excepciones, los paquetes de interfaz HIDL se encuentran en hardware/interfaces o en el directorio vendor/ . El nivel superior de hardware/interfaces 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 crea una biblioteca compartida contra la que se vinculan las implementaciones de cliente/servidor. El archivo Android.bp que crea esta biblioteca compartida lo genera automáticamente 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 de muestra IFoo.hal crea una interfaz IFoo en el paquete de muestras :

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 se vinculan 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 solo 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 de C++; contiene los métodos y tipos definidos en la interfaz de IFoo en el archivo IFoo.hal , traducidos a tipos de C++ cuando sea necesario. No contiene detalles relacionados con el mecanismo RPC (p. ej., 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 (lado del cliente) de la interfaz. Los desarrolladores nunca deben referirse a esta clase directamente.
  • BnHwFoo.h . Una clase que contiene una referencia a una implementación de IFoo y describe la implementación del código auxiliar HwBinder (lado del servidor) de la interfaz. Los desarrolladores nunca deben referirse a esta clase directamente.
  • FooAll.cpp . Una clase que contiene las implementaciones tanto para el proxy de HwBinder como para el código auxiliar de HwBinder . Cuando un cliente llama a un método de interfaz, el proxy calcula 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 detalles, consulte "Modo de transferencia" en la descripción general de HIDL ). El único archivo autogenerado 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 referirse directamente a otra cosa que no sea IFoo . Para lograr esto, incluya solo IFoo.h y enlace contra la biblioteca compartida generada.

Un cliente o servidor que use 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 puede necesitar incluir:

libhidlbase Incluye tipos de datos HIDL estándar. A partir de Android 10, esto también contiene todos los símbolos previamente en libhidltransport y libhwbinder .
libhidltransport Maneja el transporte de llamadas HIDL sobre diferentes mecanismos RPC/IPC. Android 10 desaprueba esta biblioteca.
libhwbinder Símbolos específicos del aglutinante. Android 10 desaprueba esta biblioteca.
libfmq Cola de mensajes rápidos IPC.

Espacios de nombres

Las funciones y tipos de HIDL como Return<T> y Void() se declaran en el espacio de nombres ::android::hardware . El espacio de nombres de 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