Con algunas excepciones, los paquetes de interfaz HIDL se encuentran en
hardware/interfaces
o el directorio vendor/
. El
hardware/interfaces
mapas de nivel superior directamente al
Espacio de nombres del paquete android.hardware
; la versión es un subdirectorio
en el espacio de nombres del paquete (no la interfaz).
El compilador hidl-gen
compila los archivos .hal
en
un conjunto de archivos .h
y .cpp
. A partir de estos
se compila una biblioteca compartida con la que se vinculan las implementaciones cliente/servidor.
El archivo Android.bp
que compila esta biblioteca compartida es
generado automáticamente por hardware/interfaces/update-makefiles.sh
secuencia de comandos. Cada vez que agregues un paquete nuevo a hardware/interfaces
agregar o quitar .hal
archivos en un paquete existente, debes volver a ejecutar
la secuencia de comandos para asegurarse de que la biblioteca compartida generada esté actualizada.
Por ejemplo, el archivo de muestra IFoo.hal
debería estar ubicado en
hardware/interfaces/samples/1.0
La muestra
IFoo.hal
crea una interfaz IFoo en la
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 autogenerados en un paquete HIDL se vinculan en un solo
biblioteca con el mismo nombre que el paquete (por ejemplo,
android.hardware.samples@1.0
). La biblioteca compartida también exporta
único encabezado, IFoo.h
, que pueden incluir los clientes y
servidores. Cómo usar el compilador hidl-gen
con IFoo.hal
de interfaz de usuario como entrada, el modo vinculante tiene los siguientes elementos que se generan automáticamente:
archivos:
Figura 1: Archivos generados por el compilador.
IFoo.h
Describe elIFoo
puro en una clase C++; contiene los métodos y tipos definidos en el InterfazIFoo
en el archivoIFoo.hal
, traducida a C++ los tipos de datos cuando sea necesario. No contiene detalles relacionados con los Mecanismo de RPC (por ejemplo,HwBinder
) que se usa para implementar esta interfaz. A la clase se le asignan espacios de nombres con el paquete y la versión, por ejemplo,::android::hardware::samples::IFoo::V1_0
Clientes y servidores incluir este encabezado: Clientes para los métodos de llamada en él y servidores para para implementar esos métodos.IHwFoo.h
Archivo de encabezado que contiene declaraciones para funciones que serializan tipos de datos usados en la interfaz. Los desarrolladores nunca deben incluir el encabezado directamente (no contiene clases).BpHwFoo.h
Una clase que hereda deIFoo
y describe el proxyHwBinder
(del cliente). implementación de la interfaz. Los desarrolladores nunca deben hacer referencia a esta clase directamente.BnHwFoo.h
Una clase que contiene un referencia a una implementación deIFoo
y describe la Implementación del stub (del servidor)HwBinder
de la interfaz. Los desarrolladores nunca deben hacer referencia a esta clase directamente.FooAll.cpp
Una clase que contiene las implementaciones para el proxyHwBinder
y el stub deHwBinder
. 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 kernel de Binder, que entrega la transacción al stub del (que luego llama a la implementación real del servidor).
Los archivos se estructuran de manera similar a 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 autogenerado que es independiente del mecanismo de RPC utilizado por HIDL es
IFoo.h
; Todos los demás archivos están vinculados al mecanismo de RPC de HwBinder utilizado.
por HIDL. Por lo tanto, las implementaciones de cliente y servidor nunca deben
se refieren directamente a cualquier otro elemento que no sea IFoo
. Para lograr
incluye solo IFoo.h
y vincúlalo con el contenido compartido generado
biblioteca.
Vínculo a bibliotecas compartidas
Un cliente o servidor que utiliza cualquier interfaz dentro de un paquete debe incluir el biblioteca compartida de ese paquete en uno (1) de los 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 debas incluir:
libhidlbase |
Incluye tipos de datos HIDL estándar. Primeros pasos en Android
10, contiene todos los símbolos anteriores en
libhidltransport y
libhwbinder
|
---|---|
libhidltransport |
Controla el transporte de llamadas HIDL a través de diferentes mecanismos de RPC/IPC. En Android 10, esta biblioteca deja de estar disponible. |
libhwbinder |
Símbolos específicos de Binder. Android 10 da de baja 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 está determinado por el nombre y la versión del paquete.
Por ejemplo, un paquete mypackage con la versión 1.2 de
hardware/interfaces
tiene las siguientes cualidades:
- El espacio de nombres 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 parte del espacio de nombres). - Los tipos definidos en el archivo
types.hal
del paquete se identifican como::android::hardware::mypackage::V1_2::MyPackageType