Paquetes

.

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:

Archivos
generada por el compilador

Figura 1: Archivos generados por el compilador.

  • IFoo.h Describe el IFoo puro en una clase C++; contiene los métodos y tipos definidos en el Interfaz IFoo en el archivo IFoo.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 de IFoo y describe el proxy HwBinder (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 de IFoo 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 proxy HwBinder y el stub de HwBinder. 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.

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