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:
Figura 1: Archivos generados por el compilador.
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 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 deIFoo
y describe la implementación del proxyHwBinder
(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 deIFoo
y describe la implementación de stubHwBinder
(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 proxyHwBinder
y del stubHwBinder
. 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.
Vínculo 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", ],
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