Cómo implementar referencias

Proporcionamos una implementación de referencia para el VHAL de AIDL. El subproceso de servicio principal se implementa en VehicleService.cpp. La implementación de la interfaz 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 una 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 de interactuar con el hardware o el bus del vehículo real y es específica del dispositivo. De manera opcional, los proveedores pueden adaptar esta misma arquitectura, volver a usar la misma clase DefaultVehicleHal (extenderla para reemplazar 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 de entrada básicas, incluida una verificación de IDs duplicados.
  • Asigna objetos de cliente (por ejemplo, GetValuesClient) para cada operación de cada cliente de Binder y los agrega 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 muestra 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 monitoreo de funcionamiento (consulta la función checkHealth).

IVehicleHardware es una interfaz genérica que se usa para representar la implementación específica de 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. Su propósito es ejecutarse en un emulador y no tener dependencias específicas de hardware. Las implementaciones de proveedores no deben usarlo como está y deben agregar una lógica específica del autobús del vehículo.

En Android 14, FakeVehicleHardware lee la configuración de propiedad compatible 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 pruebas. Si se configura la propiedad del sistema persist.vendor.vhal_init_value_override, esta usa el archivo de configuración de la carpeta /vendor/etc/automotive/vhaloverride/ del 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 y pueda decidirse de forma dinámica al momento de inicio. La configuración de la propiedad del vehículo debe ser estática una vez que se inicia el dispositivo.