Paquetes

Con algunas 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 dentro del 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 compila una biblioteca compartida con la que se vinculan las implementaciones de cliente o servidor. La secuencia de comandos hardware/interfaces/update-makefiles.sh genera automáticamente el archivo Android.bp que compila esta biblioteca compartida. Cada vez que agregues un paquete nuevo a hardware/interfaces o agregues o quites archivos .hal a un paquete existente, debes volver a ejecutar la secuencia de comandos para asegurarte de que la biblioteca compartida generada esté actualizada.

Por ejemplo, el archivo de muestra IFoo.hal debe estar ubicado en hardware/interfaces/samples/1.0. El archivo IFoo.hal de muestra crea una interfaz IFoo en el paquete 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);
};

Archivos generados

Los archivos generados automáticamente en un paquete HIDL se vinculan a una sola 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 los clientes y los servidores pueden incluir. Cuando se usa el compilador hidl-gen con el archivo de interfaz IFoo.hal como entrada, el modo vinculado 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 de RPC (por ejemplo, HwBinder) que se usa para implementar esta interfaz. La clase tiene 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: los clientes para llamar a métodos en él y los servidores para implementar esos métodos.
  • IHwFoo.h: Es un archivo de encabezado que contiene declaraciones para funciones que serializan tipos de datos que se usan en la interfaz. Los desarrolladores nunca deben incluir su encabezado directamente (no contiene ninguna clase).
  • BpHwFoo.h: Es una clase que hereda de IFoo y describe la implementación del proxy HwBinder (del cliente) de la interfaz. Los desarrolladores nunca deben hacer referencia a esta clase directamente.
  • BnHwFoo.h: Es una clase que contiene una referencia a una implementación de IFoo y describe la implementación de stub HwBinder (del servidor) de la interfaz. Los desarrolladores nunca deben hacer referencia a esta clase directamente.
  • FooAll.cpp: Es una clase que contiene las implementaciones del proxy HwBinder y del stub HwBinder. Cuando un cliente llama a un método de interfaz, el proxy agrupa automáticamente los argumentos del cliente y envía la transacción al controlador de kernel de Binder, que entrega la transacción al stub en el otro lado (que luego llama a la implementación real del servidor).

Los archivos tienen una estructura similar a la de los archivos que genera aidl-cpp (para obtener más información, consulta "Modo de transferencia" en la descripción general de HIDL). El único archivo generado automáticamente que es independiente del mecanismo de RPC que usa HIDL es IFoo.h. Todos los demás archivos están vinculados al mecanismo de RPC de HwBinder que usa HIDL. Por lo tanto, las implementaciones del cliente y del servidor nunca deben referirse directamente a nada que no sea IFoo. Para lograr esto, incluye solo IFoo.h y vincula con 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",
    ],

Estas son las bibliotecas adicionales que podrías necesitar incluir:

libhidlbase Incluye tipos de datos HIDL estándar. A partir de Android 10, también contiene todos los símbolos que antes estaban en libhidltransport y libhwbinder.
libhidltransport Controla el transporte de llamadas HIDL a través de diferentes mecanismos de RPC/IPC. Android 10 da de baja esta biblioteca.
libhwbinder Símbolos específicos del compilador. Android 10 deja de admitir esta biblioteca.
libfmq IPC de cola de mensajes rápida

Espacios de nombres

Las funciones y los 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 se determina según 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 completamente calificado 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 de la siguiente manera:::android::hardware::mypackage::V1_2::MyPackageType