Cómo implementar referencias

Proporcionamos una implementación de referencia para la VHAL de AIDL. El subproceso principal del servicio se implementa en VehicleService.cpp. La implementación de la interfaz de VHAL se encuentra en DefaultVehicleHal.cpp.

La implementación de referencia se basa en una arquitectura de dos capas. En la capa superior, DefaultVehicleHal implementa la interfaz AIDL de VHAL y proporciona lógica de VHAL genérica para todos los dispositivos de hardware. En la capa inferior, FakeVehicleHardware implementa la interfaz IVehicleHardware. Esta clase simula la lógica de VHAL para interactuar con el hardware real o el bus del vehículo, y es específica del dispositivo. De manera opcional, los proveedores pueden adaptar esta misma arquitectura, reutilizar la misma clase DefaultVehicleHal (extendiéndola para anular un método) y proporcionar su propia implementación de IVehicleHardware.

Implementación de referencia de VHAL
Figura 1: Implementación de referencia de VHAL

DefaultVehicleHal contiene la siguiente lógica, que se considera genérica y se puede aplicar a cualquier implementación de VHAL.

  • Implementa la interfaz IVehicle.
  • Realiza verificaciones básicas de entrada, incluida una verificación de IDs duplicados.
  • Asigna objetos cliente (por ejemplo, GetValuesClient) para cada operación de cada cliente de Binder y agrega cada uno a un grupo global.
  • Administra la lógica de las devoluciones de llamada asíncronas, como agregar una solicitud pendiente a un grupo de solicitudes pendientes. Resuelve las solicitudes pendientes cuando recibimos los resultados o devuelve un error cuando se agota el tiempo de espera de una de las solicitudes pendientes.
  • Serializa y deserializa LargeParcelable (consulta ParcelableUtils.h).
  • Administra la suscripción (consulta SubscriptionManager.h).
  • Verifica los permisos. (consulta las funciones checkReadPermission y checkWritePermission).
  • Llama a IVehicleHardware.checkHealth de forma periódica y envía señales de latido (consulta la función checkHealth).

IVehicleHardware es una interfaz genérica que se usa para representar la implementación específica del hardware de un VHAL. La implementación de referencia para IVehicleHardware es FakeVehicleHardware, que usa un mapa en la memoria para almacenar el valor de la propiedad y no se comunica con un bus de vehículo real. Está diseñado para ejecutarse en un emulador y no tener dependencias específicas del hardware. Las implementaciones del proveedor no deben usarlo tal como está y deben agregar lógica específica del bus del vehículo.

A partir de Android 14, FakeVehicleHardware lee la configuración de propiedad admitida en el tiempo de ejecución durante la inicialización desde la carpeta /vendor/etc/automotive/vhalconfig/ del dispositivo, que contiene un archivo de configuración de estilo JSON. Consulta el archivo README de VHAL de referencia para conocer el formato y el contenido del archivo de configuración.

FakeVehicleHardware también admite la anulación del archivo de configuración para las pruebas. Si se configura la propiedad del sistema persist.vendor.vhal_init_value_override (esta propiedad se debe configurar en el momento de la compilación o muy temprano durante el arranque antes de la inicialización de VHAL), se usa el archivo de configuración de la carpeta /vendor/etc/automotive/vhaloverride/ en el dispositivo para anular la configuración existente. Una implementación del proveedor puede usar un enfoque similar para que la configuración de la propiedad compatible con VHAL no esté codificada de forma rígida y se pueda decidir de forma dinámica en el tiempo de inicio. La lista de parámetros de configuración de propiedades del vehículo debe ser estática después de que se inicialice VHAL.

A partir de Android 16, GRPCVehicleHardware proporciona otra implementación de referencia IVehicleHardware. Esta implementación supone que hay un servidor independiente que se ejecuta en una máquina o VM remota que contiene la lógica de control de propiedades. El VHAL que se ejecuta en dispositivos AAOS actúa como un proxy que reenvía solicitudes al servidor remoto. Consulta grpc para obtener más detalles.