Implementazione dei riferimenti

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.

Implementazione del riferimento VHAL
Figura 1. Implementazione di riferimento VHAL

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 (vedi ParcelableUtils.h).
  • Gestisce l'abbonamento (vedi SubscriptionManager.h).
  • Controlla le autorizzazioni. (consulta 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 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.