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:
-
IFoo.h
Describe la interfazIFoo
pura en una clase C++; contiene los métodos y tipos definidos en la interfazIFoo
en el archivoIFoo.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 deIFoo
y describe la implementación del proxyHwBinder
(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ónIFoo
y describe la implementación del código auxiliarHwBinder
(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 proxyHwBinder
como para el código auxiliarHwBinder
. 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.
Vinculación a bibliotecas compartidas
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