Implementazione di riferimento

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 .

Implementazione di riferimento VHAL
Figura 1. Implementazione di riferimento VHAL

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 (vedere ParcelableUtils.h ).
  • Gestisce l'abbonamento (vedi SubscriptionManager.h ).
  • Controlla i permessi. (Vedi le funzioni checkReadPermission e checkWritePermission ).
  • 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.