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:

-
IFoo.h. Describe la interfazIFoopura en una clase de C++; contiene los métodos y tipos definidos en la interfaz deIFooen el archivoIFoo.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 deIFooy describe la implementación del proxyHwBinder(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 deIFooy describe la implementación del código auxiliarHwBinder(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 deHwBindercomo para el código auxiliar deHwBinder. 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.
Vinculación a bibliotecas compartidas
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
IMyInterfaceen ese paquete es:::android::hardware::mypackage::V1_2::IMyInterface. (IMyInterfacees un identificador, no forma parte del espacio de nombres). - Los tipos definidos en el archivo
types.haldel paquete se identifican como:::android::hardware::mypackage::V1_2::MyPackageType