Referenzimplementierung

Wir stellen eine Referenzimplementierung für die AIDL-VHAL bereit. Der Hauptdienst-Thread 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 (indem sie sie erweitern, um eine Methode zu überschreiben) und eine eigene IVehicleHardware-Implementierung bereitstellen.

VHAL-Referenzimplementierung
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 grundlegende 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 Logik für asynchrone Rückrufe, z. B. das Hinzufügen einer ausstehenden Anfrage zu einem Pool ausstehender 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, die die hardwarespezifische Implementierung einer VHAL darstellt. 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, sondern müssen fahrzeugbusspezifische Logik hinzufügen.

Unter Android 14 liest FakeVehicleHardware die unterstützte Property-Konfiguration zur Laufzeit während der Initialisierung aus dem Ordner /vendor/etc/automotive/vhalconfig/ des Geräts, der eine JSON-Konfigurationsdatei 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.