Forniamo un'implementazione di riferimento per AIDL VHAL. Il thread del servizio principale è implementato in VehicleService.cpp
. L'implementazione dell'interfaccia VHAL si trova in DefaultVehicleHal.cpp
.
L'implementazione di riferimento si basa su un'architettura a due livelli. Nel livello superiore, DefaultVehicleHal
, implementa l'interfaccia VHAL AIDL e fornisce la logica VHAL generica a tutti i dispositivi hardware. Nel livello inferiore, FakeVehicleHardware
, implementa l'interfaccia IVehicleHardware
. Questa classe simula la logica VHAL di interazione con l'hardware reale o il bus del veicolo 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 IVehicleHardware
.
DefaultVehicleHal
contiene la logica seguente, considerata generica e applicabile a qualsiasi implementazione VHAL.
- Implementa l'interfaccia
IVehicle
. - Esegue controlli di input di base, incluso un controllo per gli ID duplicati.
- Assegna oggetti client (ad esempio,
GetValuesClient
) per ogni operazione per ciascun client dello strumento di associazione e li aggiunge a un pool globale. - Gestisce la logica dei callback asincroni, ad esempio l'aggiunta di una richiesta in sospeso a un pool di richieste in sospeso. Risolve le richieste in sospeso quando riceviamo i risultati o restituisce un errore quando una delle richieste in sospeso scade.
- Serializza e deserializza
LargeParcelable
(vedereParcelableUtils.h
). - Gestisce l'abbonamento (vedi
SubscriptionManager.h
). - Controlla i permessi. (Vedi le funzioni
checkReadPermission
echeckWritePermission
). - Richiama periodicamente IVehicleHardware.checkHealth e invia segnali di heartbeat (vedere la funzione
checkHealth
).
IVehicleHardware
è un'interfaccia generica utilizzata per rappresentare un'implementazione specifica dell'hardware di VHAL. L'implementazione di riferimento per IVehicleHardware
è FakeVehicleHardware
, che utilizza una mappa in memoria per archiviare il valore della proprietà e non comunica con un autobus del veicolo reale. È progettato per essere eseguito su un emulatore e non ha dipendenze specifiche dell'hardware. Le implementazioni del fornitore non devono utilizzarlo così com'è e devono aggiungere una logica specifica del bus del veicolo.
In 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. Consultare il file README VHAL di riferimento per il formato del file di configurazione e il contenuto 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, utilizza il file di configurazione dalla cartella /vendor/etc/automotive/vhaloverride/
sul dispositivo per sovrascrivere la configurazione esistente. L'implementazione di un fornitore può utilizzare un approccio simile in modo che la configurazione delle proprietà supportate da VHAL non sia codificata e possa essere decisa dinamicamente al momento dell'avvio. La configurazione delle proprietà del veicolo deve essere statica una volta avviato il dispositivo.