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.
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
(sieheParcelableUtils.h
). - Verwaltet das Abo (siehe
SubscriptionManager.h
). - Prüft die Berechtigungen. (Siehe Funktionen
checkReadPermission
undcheckWritePermission
.) - 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.