Referenzimplementierung

Wir stellen eine Referenzimplementierung für die AIDL-VHAL bereit. Der Hauptdienstthread ist unter VehicleService.cpp implementiert. Die Implementierung der VHAL-Schnittstelle befindet sich unter DefaultVehicleHal.cpp.

Die Referenzimplementierung basiert auf einer zweischichtigen Architektur. In der oberen Schicht implementiert DefaultVehicleHal die VHAL-AIDL-Schnittstelle und stellt eine generische VHAL-Logik für alle Hardwaregeräte bereit. In der unteren Schicht, FakeVehicleHardware, wird die IVehicleHardware-Schnittstelle implementiert. Diese Klasse simuliert die VHAL-Logik der Interaktion mit der tatsächlichen Hardware oder dem Fahrzeugbus und ist gerätespezifisch. Optional können Anbieter diese Architektur anpassen, dieselbe DefaultVehicleHal-Klasse wiederverwenden (d. h. sie erweitern, um eine Methode zu überschreiben) und ihre eigene IVehicleHardware-Implementierung bereitstellen.

Referenzimplementierung für VHAL
Abbildung 1: VHAL-Referenzimplementierung

DefaultVehicleHal enthält die folgende Logik, die als generisch gilt und auf jede VHAL-Implementierung angewendet werden kann.

  • Implementiert die IVehicle-Schnittstelle.
  • Führt einfache Eingabeprüfungen durch, einschließlich einer Prüfung auf doppelte IDs.
  • Weiset Clientobjekte (z. B. GetValuesClient) für jeden Vorgang für jeden Binder-Client zu und fügt sie einem globalen Pool hinzu.
  • Verwaltet die asynchrone Callback-Logik, z. B. das Hinzufügen einer ausstehenden Anfrage zu einem Pool mit ausstehenden Anfragen. Lösen ausstehende Anfragen, wenn wir die Ergebnisse erhalten, oder geben einen Fehler zurück, wenn bei einer der ausstehenden Anfragen eine Zeitüberschreitung auftritt.
  • Serialisiert und deserialisiert LargeParcelable (siehe ParcelableUtils.h).
  • Verwaltet das Abo (siehe SubscriptionManager.h).
  • Prüft die Berechtigungen. (Siehe Funktionen checkReadPermission und checkWritePermission.)
  • Ruft regelmäßig IVehicleHardware.checkHealth auf und sendet Heartbeat-Signale (siehe Funktion checkHealth).

IVehicleHardware ist eine generische Schnittstelle zur Darstellung der hardwarespezifischen Implementierung eines VHAL. Die Referenzimplementierung für IVehicleHardware ist FakeVehicleHardware. Dabei wird ein In-Memory-Mapping verwendet, um den Attributwert zu speichern. Es erfolgt keine Kommunikation mit einem tatsächlichen Fahrzeugbus. Sie ist für die Ausführung auf einem Emulator vorgesehen und hat keine hardwarespezifischen Abhängigkeiten. Anbieterimplementierungen dürfen sie nicht unverändert verwenden und müssen fahrzeugbusspezifische Logik hinzufügen.

In Android 14 liest FakeVehicleHardware die unterstützte Attributkonfiguration zur Laufzeit während der Initialisierung aus dem Ordner /vendor/etc/automotive/vhalconfig/ des Geräts, der eine Konfigurationsdatei im JSON-Stil enthält. Informationen zum Format und Inhalt von Konfigurationsdateien finden Sie in der Referenz-README-Datei für VHAL.

FakeVehicleHardware unterstützt auch die Überschreibung von Konfigurationsdateien für Tests. Wenn die Systemeigenschaft persist.vendor.vhal_init_value_override festgelegt ist, wird die Konfigurationsdatei aus dem Ordner /vendor/etc/automotive/vhaloverride/ auf dem Gerät verwendet, um die vorhandene Konfiguration zu überschreiben. Eine Anbieterimplementierung kann einen ähnlichen Ansatz verwenden, sodass die von VHAL unterstützte Property-Konfiguration nicht hartcodiert ist und beim Start dynamisch festgelegt werden kann. Die Konfiguration der Fahrzeugeigenschaft muss nach dem Start des Geräts statisch sein.