Implementazione dei riferimenti

Forniamo un'implementazione di riferimento per 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 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.

Implementazione di riferimento VHAL
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).
  • Gestisce l'abbonamento (vedi SubscriptionManager.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.