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 interfazIFoo
pura en una clase de C++; contiene los métodos y tipos definidos en la interfaz deIFoo
en 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 deIFoo
y 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 deIFoo
y 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 deHwBinder
como 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
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