A partir del 27 de marzo de 2025, te recomendamos que uses android-latest-release en lugar de aosp-main para compilar y contribuir a AOSP. Para obtener más información, consulta Cambios en AOSP.
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, reutilizar la misma clase DefaultVehicleHal (extendiéndola para reemplazar un método) y proporcionar su propia implementación de IVehicleHardware.
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 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 indicadores de actividad (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 los proveedores no deben usarlo tal como está y deben agregar una lógica específica del bus del vehículo.
A partir de Android 14, FakeVehicleHardware lee la configuración de propiedades admitidas durante 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 de información 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 establece la propiedad del sistema persist.vendor.vhal_init_value_override (esta propiedad se debe establecer en el momento de la compilación o muy al principio durante el inicio 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 propiedades compatibles con VHAL no esté codificada de forma fija y se pueda decidir de forma dinámica en el momento del inicio.
La lista de parámetros de configuración de propiedades del vehículo debe ser estática después de que se inicializa VHAL.
A partir de Android 16, GRPCVehicleHardware proporciona otra implementación de referencia de IVehicleHardware. Esta implementación asume 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.
El contenido y las muestras de código que aparecen en esta página están sujetas a las licencias que se describen en la Licencia de Contenido. Java y OpenJDK son marcas registradas de Oracle o sus afiliados.
Última actualización: 2025-07-26 (UTC)
[[["Fácil de comprender","easyToUnderstand","thumb-up"],["Resolvió mi problema","solvedMyProblem","thumb-up"],["Otro","otherUp","thumb-up"]],[["Falta la información que necesito","missingTheInformationINeed","thumb-down"],["Muy complicado o demasiados pasos","tooComplicatedTooManySteps","thumb-down"],["Desactualizado","outOfDate","thumb-down"],["Problema de traducción","translationIssue","thumb-down"],["Problema con las muestras o los códigos","samplesCodeIssue","thumb-down"],["Otro","otherDown","thumb-down"]],["Última actualización: 2025-07-26 (UTC)"],[],[],null,["# Reference implementation\n\nWe provide a\n[reference implementation](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/automotive/vehicle/aidl/impl/current)\nfor the AIDL VHAL. The main service thread is implemented\nat\n[`VehicleService.cpp`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/automotive/vehicle/aidl/impl/current/vhal/src/VehicleService.cpp).\nThe VHAL interface implementation is located at\n[`DefaultVehicleHal.cpp`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/automotive/vehicle/aidl/impl/current/vhal/src/DefaultVehicleHal.cpp).\n\n\nThe reference implementation is based on a two-layer architecture. On the upper layer,\n`DefaultVehicleHal`, implements VHAL AIDL interface and provides VHAL logic\ngeneric to all hardware devices. On the lower layer, `FakeVehicleHardware`,\nimplements the `IVehicleHardware` interface. This class simulates the VHAL logic\nof interacting with actual hardware or vehicle bus and is device-specific. Optionally, vendors\ncan adapt this same architecture, reuse the same `DefaultVehicleHal` class (extending\nit to overwrite a method), and provide their own `IVehicleHardware` implementation.\n**Figure 1.** VHAL reference implementation\n\n[`DefaultVehicleHal`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/automotive/vehicle/aidl/impl/current/vhal/src/DefaultVehicleHal.cpp)\ncontains the following logic, which is considered to be generic and can apply to any VHAL\nimplementation.\n\n- Implements the `IVehicle` interface.\n- Performs basic input checks, including a check for duplicate IDs.\n- Allocates client objects (for example, `GetValuesClient`) for each operation for each binder client, and adds each to a global pool.\n- Manages async callbacks logic, such as adding a pending request to a pending request pool. Resolves pending requests when we receive the results or returns error when one of the pending requests times out.\n- Serializes and deserializes `LargeParcelable` (see `ParcelableUtils.h`).\n- Manages subscription (see `SubscriptionManager.h`).\n- Checks permissions. (See the `checkReadPermission` and `checkWritePermission` functions).\n- Periodically calls `IVehicleHardware.checkHealth` and sends heartbeat signals (see the `checkHealth` function).\n\n[`IVehicleHardware`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/automotive/vehicle/aidl/impl/current/hardware/include/IVehicleHardware.h)\nis a generic interface used to represent a VHAL's hardware-specific\nimplementation. The reference implementation for `IVehicleHardware` is\n[`FakeVehicleHardware`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/automotive/vehicle/aidl/impl/current/fake_impl/hardware/src/FakeVehicleHardware.cpp),\nwhich uses an in-memory map to store property value and does\nnot communicate with an actual vehicle bus. It's intended to run on an emulator and have no\nhardware-specific dependencies. Vendor implementations must not use it as-is and must add\nvehicle bus-specific logic.\n\nStarting in Android 14, `FakeVehicleHardware` reads the supported property config at run-time\nduring initialization from the device's `/vendor/etc/automotive/vhalconfig/` folder,\nwhich contains a JSON-style config file. See the\n[reference VHAL README file](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/automotive/vehicle/aidl/impl/current/default_config/config/README.md)\nfor config file format and config file content.\n\n`FakeVehicleHardware` also supports config file override for testing. If the\nsystem property `persist.vendor.vhal_init_value_override` is set (this property must be\nset at build time or very early during boot before VHAL initialization), it uses the config\nfile from the `/vendor/etc/automotive/vhaloverride/` folder on the device to override\nthe existing configuration. A vendor implementation can use a similar approach so that the VHAL-\nsupported property configuration is not hard-coded and can be dynamically decided at start time.\nThe list of vehicle property configs must be static after VHAL is initialized.\n\nStarting in Android 16, [`GRPCVehicleHardware`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/automotive/vehicle/aidl/impl/current/grpc/GRPCVehicleHardware.cpp)\nprovides another reference `IVehicleHardware` implementation. This implementation\nassumes there is a separate server running on a remote machine or VM which contains the property\nhandling logic. The VHAL running on AAOS devices acts as a proxy that forwards requests to\nthe remote server. See [grpc](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/automotive/vehicle/aidl/impl/current/README.md#grpc)\nfor more details."]]