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.
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
(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 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.