Starting March 27, 2025, we recommend using android-latest-release instead of aosp-main to build and contribute to AOSP. For more information, see Changes to AOSP.
The reference implementation is based on a two-layer architecture. On the upper layer,
DefaultVehicleHal, implements VHAL AIDL interface and provides VHAL logic
generic to all hardware devices. On the lower layer, FakeVehicleHardware,
implements the IVehicleHardware interface. This class simulates the VHAL logic
of interacting with actual hardware or vehicle bus and is device-specific. Optionally, vendors
can adapt this same architecture, reuse the same DefaultVehicleHal class (extending
it to overwrite a method), and provide their own IVehicleHardware implementation.
Figure 1. VHAL reference implementation
DefaultVehicleHal
contains the following logic, which is considered to be generic and can apply to any VHAL
implementation.
Implements the IVehicle interface.
Performs basic input checks, including a check for duplicate IDs.
Allocates client objects (for example, GetValuesClient) for each operation for
each binder client, and adds each to a global pool.
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.
Serializes and deserializes LargeParcelable (see
ParcelableUtils.h).
Manages subscription (see SubscriptionManager.h).
Checks permissions. (See the checkReadPermission and
checkWritePermission functions).
Periodically calls IVehicleHardware.checkHealth and sends heartbeat signals (see the
checkHealth function).
IVehicleHardware
is a generic interface used to represent a VHAL’s hardware-specific
implementation. The reference implementation for IVehicleHardware is
FakeVehicleHardware,
which uses an in-memory map to store property value and does
not communicate with an actual vehicle bus. It's intended to run on an emulator and have no
hardware-specific dependencies. Vendor implementations must not use it as-is and must add
vehicle bus-specific logic.
Starting in Android 14, FakeVehicleHardware reads the supported property config at run-time
during initialization from the device’s /vendor/etc/automotive/vhalconfig/ folder,
which contains a JSON-style config file. See the
reference VHAL README file
for config file format and config file content.
FakeVehicleHardware also supports config file override for testing. If the
system property persist.vendor.vhal_init_value_override is set (this property must be
set at build time or very early during boot before VHAL initialization), it uses the config
file from the /vendor/etc/automotive/vhaloverride/ folder on the device to override
the existing configuration. A vendor implementation can use a similar approach so that the VHAL-
supported property configuration is not hard-coded and can be dynamically decided at start time.
The list of vehicle property configs must be static after VHAL is initialized.
Starting in Android 16, GRPCVehicleHardware
provides another reference IVehicleHardware implementation. This implementation
assumes there is a separate server running on a remote machine or VM which contains the property
handling logic. The VHAL running on AAOS devices acts as a proxy that forwards requests to
the remote server. See grpc
for more details.
Content and code samples on this page are subject to the licenses described in the Content License. Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
Last updated 2025-08-29 UTC.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-08-29 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."]]