A partire dal 27 marzo 2025, ti consigliamo di utilizzare android-latest-release anziché aosp-main per compilare e contribuire ad AOSP. Per ulteriori informazioni, vedi Modifiche ad AOSP.
L'implementazione di riferimento si basa su un'architettura a due livelli. Nel livello superiore,
DefaultVehicleHal, implementa l'interfaccia AIDL VHAL e fornisce la logica VHAL
generica per tutti i dispositivi hardware. Nel livello inferiore, FakeVehicleHardware,
implementa l'interfaccia IVehicleHardware. Questa classe simula la logica VHAL per interagire con l'hardware o il bus del veicolo reale ed è specifica del dispositivo. Facoltativamente, i fornitori possono adattare questa stessa architettura, riutilizzare la stessa classe DefaultVehicleHal (estendendola per sovrascrivere un metodo) e fornire la propria implementazione di IVehicleHardware.
Figura 1. Implementazione di riferimento VHAL
DefaultVehicleHal
contiene la seguente logica, considerata generica e applicabile a qualsiasi implementazione VHAL.
Implementa l'interfaccia IVehicle.
Esegue controlli di base sugli input, tra cui la ricerca di ID duplicati.
Alloca oggetti client (ad esempio GetValuesClient) per ogni operazione per ogni client binder e li aggiunge a un pool globale.
Gestisce la logica dei callback asincroni, ad esempio l'aggiunta di una richiesta in attesa a un pool di richieste in attesa.
Risolve le richieste in attesa quando riceviamo i risultati o restituisce un errore quando una delle richieste in attesa scade.
Esegue la serializzazione e la deserializzazione di LargeParcelable (vedi
ParcelableUtils.h).
Controlla le autorizzazioni. (vedi le funzioni checkReadPermission e
checkWritePermission).
Chiama periodicamente IVehicleHardware.checkHealth e invia segnali di heartbeat (vedi la funzione
checkHealth).
IVehicleHardware
è un'interfaccia generica utilizzata per rappresentare l'implementazione specifica per l'hardware di un VHAL. L'implementazione di riferimento per IVehicleHardware è
FakeVehicleHardware,
che utilizza una mappa in memoria per memorizzare il valore della proprietà e
non comunica con un bus di un veicolo reale. È progettato per essere eseguito su un emulatore e non ha dipendenze specifiche per l'hardware. Le implementazioni dei fornitori non devono utilizzarlo così com'è e devono aggiungere
una logica specifica per il bus del veicolo.
A partire da Android 14, FakeVehicleHardware legge la configurazione delle proprietà supportate in fase di esecuzione
durante l'inizializzazione dalla cartella /vendor/etc/automotive/vhalconfig/ del dispositivo,
che contiene un file di configurazione in stile JSON. Consulta il file README di riferimento VHAL per il formato e i contenuti del file di configurazione.
FakeVehicleHardware supporta anche l'override del file di configurazione per i test. Se la proprietà di sistema persist.vendor.vhal_init_value_override è impostata (questa proprietà deve essere impostata al momento della compilazione o all'inizio dell'avvio prima dell'inizializzazione di VHAL), viene utilizzato il file di configurazione della cartella /vendor/etc/automotive/vhaloverride/ sul dispositivo per eseguire l'override della configurazione esistente. Un'implementazione del fornitore può utilizzare un approccio simile in modo che la configurazione delle proprietà supportate da VHAL non sia hardcoded e possa essere decisa dinamicamente all'avvio.
L'elenco delle configurazioni delle proprietà del veicolo deve essere statico dopo l'inizializzazione di VHAL.
A partire da Android 16, GRPCVehicleHardware
fornisce un'altra implementazione di riferimento per IVehicleHardware. Questa implementazione assume che esista un server separato in esecuzione su una macchina o una VM remota che contenga la logica di gestione delle proprietà. VHAL in esecuzione sui dispositivi AAOS funge da proxy che inoltra le richieste al
server remoto. Per ulteriori dettagli, consulta grpc.
I campioni di contenuti e codice in questa pagina sono soggetti alle licenze descritte nella Licenza per i contenuti. Java e OpenJDK sono marchi o marchi registrati di Oracle e/o delle sue società consociate.
Ultimo aggiornamento 2025-07-26 UTC.
[[["Facile da capire","easyToUnderstand","thumb-up"],["Il problema è stato risolto","solvedMyProblem","thumb-up"],["Altra","otherUp","thumb-up"]],[["Mancano le informazioni di cui ho bisogno","missingTheInformationINeed","thumb-down"],["Troppo complicato/troppi passaggi","tooComplicatedTooManySteps","thumb-down"],["Obsoleti","outOfDate","thumb-down"],["Problema di traduzione","translationIssue","thumb-down"],["Problema relativo a esempi/codice","samplesCodeIssue","thumb-down"],["Altra","otherDown","thumb-down"]],["Ultimo aggiornamento 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."]]