Wir stellen eine Referenzimplementierung für das AIDL VHAL bereit. Der Hauptdienstthread ist unter VehicleService.cpp
implementiert. Die VHAL-Schnittstellenimplementierung befindet sich unter DefaultVehicleHal.cpp
.
Die Referenzimplementierung basiert auf einer zweischichtigen Architektur. Auf der oberen Ebene implementiert DefaultVehicleHal
die VHAL-AIDL-Schnittstelle und stellt generische VHAL-Logik für alle Hardwaregeräte bereit. Auf der unteren Ebene implementiert FakeVehicleHardware
die IVehicleHardware
Schnittstelle. Diese Klasse simuliert die VHAL-Logik der Interaktion mit der tatsächlichen Hardware oder dem Fahrzeugbus und ist gerätespezifisch. Optional können Anbieter dieselbe Architektur anpassen, dieselbe DefaultVehicleHal
Klasse wiederverwenden (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 grundlegende Eingabeprüfungen durch, einschließlich einer Prüfung auf doppelte IDs.
- Weist Clientobjekte (z. B.
GetValuesClient
) für jeden Vorgang für jeden Binder-Client zu und fügt sie jeweils einem globalen Pool hinzu. - Verwaltet die asynchrone Rückruflogik, z. B. das Hinzufügen einer ausstehenden Anfrage zu einem Pool ausstehender Anfragen. Löst ausstehende Anfragen, wenn wir die Ergebnisse erhalten, oder gibt einen Fehler zurück, wenn bei einer der ausstehenden Anfragen das Zeitlimit überschritten wird.
- Serialisiert und deserialisiert
LargeParcelable
(sieheParcelableUtils.h
). - Verwaltet das Abonnement (siehe
SubscriptionManager.h
). - Überprüft Berechtigungen. (Siehe die Funktionen
checkReadPermission
undcheckWritePermission
). - Ruft regelmäßig IVehicleHardware.checkHealth auf und sendet Heartbeat-Signale (siehe Funktion
checkHealth
).
IVehicleHardware
ist eine generische Schnittstelle, die zur Darstellung der hardwarespezifischen Implementierung eines VHAL verwendet wird. Die Referenzimplementierung für IVehicleHardware
ist FakeVehicleHardware
, die eine In-Memory-Map zum Speichern des Eigenschaftswerts verwendet und nicht mit einem tatsächlichen Fahrzeugbus kommuniziert. Es soll auf einem Emulator ausgeführt werden und weist keine hardwarespezifischen Abhängigkeiten auf. Anbieterimplementierungen dürfen es nicht unverändert verwenden und müssen fahrzeugbusspezifische Logik hinzufügen.
In Android 14 liest FakeVehicleHardware
die unterstützte Eigenschaftskonfiguration 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 Konfigurationsdateiformat und zum Inhalt der Konfigurationsdatei finden Sie in der Referenz-VHAL-README-Datei .
FakeVehicleHardware
unterstützt auch das Überschreiben von Konfigurationsdateien zu Testzwecken. 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 VHAL-unterstützte Eigenschaftskonfiguration nicht fest codiert ist und zum Startzeitpunkt dynamisch festgelegt werden kann. Die Fahrzeugeigenschaftenkonfiguration muss statisch sein, sobald das Gerät gestartet wird.