Forniamo un'implementazione di riferimento per il VHAL AIDL. Il thread del servizio principale è implementato
in
VehicleService.cpp
.
L'implementazione dell'interfaccia VHAL si trova all'indirizzo
DefaultVehicleHal.cpp
.
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 di un veicolo reale ed è specifica per il dispositivo. Facoltativamente, i fornitori possono adattare la stessa architettura, riutilizzare la stessa classe DefaultVehicleHal
(estendendola per sovrascrivere un metodo) e fornire la propria implementazione di IVehicleHardware
.
DefaultVehicleHal
contiene la seguente logica, che è considerata generica e può essere applicata a qualsiasi implementazione VHAL.
- Implementa l'interfaccia
IVehicle
. - Esegue controlli di base sugli input, incluso un controllo per rilevare ID duplicati.
- Alloca oggetti client (ad esempio
GetValuesClient
) per ogni operazione per ogni client binder e aggiunge ciascuno 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
(vediParcelableUtils.h
). - Gestisce l'abbonamento (vedi
SubscriptionManager.h
). - Controlla le autorizzazioni. (consulta le funzioni
checkReadPermission
echeckWritePermission
). - Chiama periodicamente IVehicleHardware.checkHealth e invia segnali di heartbeat (vedi la funzione
checkHealth
).
IVehicleHardware
è un'interfaccia generica utilizzata per rappresentare l'implementazione specifica per hardware di una 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.
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. 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, viene utilizzato il file di configurazione della cartella /vendor/etc/automotive/vhaloverride/
sul dispositivo per eseguire l'override della configurazione esistente. L'implementazione di un fornitore può utilizzare un approccio simile, in modo che la configurazione della proprietà supportata da VHAL non sia hardcoded e possa essere decisa dinamicamente all'ora di inizio.
La configurazione della proprietà del veicolo deve essere statica una volta avviato il dispositivo.