Die Vehicle Services Interface Definition Language (VSIDL)-Middleware definiert eine Reihe von Rust-Bibliotheken, die eine Abstraktionsebene über dem Kommunikationsstack des Software Defined Vehicle (SDV) erstellen, um die Verwendung des SDV-Ökosystems zu vereinfachen. Die Middleware bietet eine standardisierte Möglichkeit für Dienste, miteinander zu kommunizieren und zu interagieren. Sowohl der von VSIDLC generierte Code als auch Ihr benutzerdefinierter Code verwenden diese Bibliotheken.
Der Vehicle Services Interface Definition Language-Compiler (VSIDLC) validiert Definitionen, generiert Build-Dateien (Android.bp) mit genrule-Zielen, um während des Build-Prozesses Rust-Middleware-Code zu erstellen, und erstellt Bereitstellungskonfigurationen aus den VSIDL- und Protobuf-Dateien in einem Katalog. Abbildung 1 zeigt die Eingabe für VSIDLC und die von VSIDLC generierte Ausgabe:
Abbildung 1 : VSIDLC-Ein- und -Ausgaben.
Im Folgenden finden Sie eine Erläuterung des Diagramms:
Als Eingaben geben Sie die folgenden Dateien an, die in Verzeichnissen organisiert sind, die als Kataloge bezeichnet werden:
- Proto-Dateien (mit der Erweiterung
.proto) enthalten Datenstrukturen, die zwischen den von VSIDL definierten Diensteinheiten ausgetauscht werden. - VSIDL-Dateien (mit der Erweiterung
.vsidl) definieren Dienstpakete, Diensteinheiten und die Inhaberschaft des Einheitentyps. Android.bp-Dateien in jedem Katalogverzeichnis definierenrust_protobuf-Build-Ziele für alle Proto-Dateien im Katalog. VSIDLC verwendet den in diesen Zielen angegebenencrate_name, um auf die generierten Protobuf-Nachrichtentypen in Rust zu verweisen.
- Proto-Dateien (mit der Erweiterung
Führen Sie VSIDLC aus, um die folgenden Dateien auszugeben:
Android.bp-Dateien werden im Ordner jedes Dienstpakets generiert. Wenn Sie--genrulefestlegen, generieren diese Ziele während des Build-Prozesses aktuelle Rust-Dateien und enthalten die erforderlichenrust_protobuf-Bibliotheksabhängigkeiten.service_bundle.rs-Dateien werden für jedes Dienstpaket generiert und enthalten die Hauptstruktur (struct) und Funktionen für die Interaktion mit Middleware-Komponenten.lib.rs-Dateien werden für jeden RPC-Dienst generiert, der zu einem Paket gehört, und in einem Unterordner platziert, der nach dem RPC-Dienst benannt ist. Diese Dateien enthalten:Ein
Interface-Trait implementiert die serverseitige Logik.Eine
Client-Struktur ruft einen RPC-Dienst auf.diagnostics.rs-Dateien werden generiert, wenn in der VSIDL-Datei einediagnostics_declarationvorhanden ist. Sie enthalten die erforderlichen Bindungen für UDS-basierte Diagnosen.Bereitstellungs- und Sicherheitskonfigurationen werden mit dem Flag
--apexgeneriert. Diese werden in den Verzeichnissenapex/undconfigs/platziert und enthalten Orchestrierungsdateien (.textproto) und Sicherheitsrichtlinien (Berechtigungen), die für die Kommunikation zwischen Diensten erforderlich sind.Mit dem Flag
--serviceswird ein Dienst-Boilerplate generiert. Dieser wird in einem Verzeichnisservices/platziert und enthält ein Rust-Anwendungsskelett, einschließlich einermain.rs-Datei, um die Implementierung zu beschleunigen.
VSIDLC ausführen
So führen Sie VSIDLC aus:
Wenn Sie Ihre Umgebung noch nicht eingerichtet haben, führen Sie
source build/envsetup.shaus.Führen Sie den folgenden Befehl aus, um VSIDLC zu erstellen:
m vsidlcPrüfen Sie, ob Ihr VSIDL-Katalogverzeichnis die erforderlichen Build-, Protobuf- und VSIDL-Dateien enthält.
Führen Sie den Befehl
vsidlcaus:vsidlc -c path_to_catalog -o output_directory -pWobei:
-c path_to_cataloggibt den Pfad zum Haupt katalogverzeichnis an.-o output_directorygibt das übergeordnete Verzeichnis an in dem dasgenerated_rsAusgabeverzeichnis erstellt wird.- (optional)
--apexgeneriert Orchestrierungs- und Sicherheitskonfigurationsartefakte. - (optional)
--servicesgeneriert ein Rust-Anwendungsskelett für den Schnellstart. - (optional)
-plöscht vorhandene generierte Verzeichnisse (z. B.generated_rsund gegebenenfallsapex,configsoderservices), bevor neue Dateien generiert werden. - (optional)
--genrulegeneriertAndroid.bp-Genrules anstelle von Rust-Code. Die Genrules generieren den erforderlichen Rust-Code im laufenden Betrieb, wenn Siemausführen, um zu vermeiden, dass generierte Artefakte unter Versionsverwaltung gestellt werden.
Es wird ein Verzeichnis
generated_rsmit einerAndroid.bp-Datei und den generierten Middleware-Dateien erstellt. Dieses Verzeichnis ist in Unterverzeichnissen organisiert, die den vollständig qualifizierten Namen Ihrer definierten Dienstpakete entsprechen.
Abhängigkeiten verarbeiten
Standardmäßig generiert VSIDLC nur Code für den Hauptkatalog, nicht für Abhängigkeitskataloge. Wenn Ihr Katalog Typen oder Diensteinheiten verwendet, die in anderen Katalogen definiert sind, geben Sie den Pfad zu jedem Abhängigkeitskatalog mit dem Flag -d an:
vsidlc -c path_to_catalog -o output_directory -d dep1_path -d dep2_path ...
Sie müssen Pfade für den gesamten Abhängigkeitsgraphen angeben, einschließlich transitiver Abhängigkeiten (Abhängigkeiten von Abhängigkeiten). Angenommen, Sie haben den folgenden Katalogabhängigkeitsbaum:
Abbildung 2 : Beispiel für einen VSIDLC-Abhängigkeitsbaum.
Um Middleware für jeden Katalog im Baum zu generieren, müssen Sie die folgenden Befehle ausführen:
| Zielkatalog | Abhängigkeiten | Befehl |
|---|---|---|
| SDV Core-Katalog | – | vsidlc -o ./generated -c ./path/to/sdv_core_catalog |
| Diagnosekatalog | SDV Core-Katalog | vsidlc -o ./generated -c ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
| SOMEIP-Katalog | Diagnosekatalog, SDV Core-Katalog | vsidlc -o ./generated -c ./path/to/someip_catalog -d ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
| OEM-Katalog | Diagnosekatalog, SOMEIP-Katalog, (transitiv) SDV Core-Katalog | vsidlc -o ./generated -c ./path/to/oem_catalog -d ./path/to/someip_catalog -d ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
Rust-Ausgabe formatieren
Standardmäßig verwendet VSIDL rustfmt, um die Rust-Ausgabe zu formatieren. Damit die Standardeinstellung ordnungsgemäß funktioniert, legen Sie die Umgebungsvariable $ANDROID_BUILD_TOP oder die Umgebungsvariablen RUSTFMT_PATH und RUSTFMT_TOML_PATH fest. Wenn Sie das Standardformat ändern möchten, in dem Rust ausgegeben wird, verwenden Sie die Option --rust-formatter mit pretty-please oder none:
Wenn Sie das Ausgabeformat in „
prettyplease“ ändern möchten, verwenden Sie den Wert „pretty-please“:vsidlc -c path_to_catalog -o output_directory -p --rust-formatter pretty-pleaseWenn Sie das Ausgabeformat in „none“ ändern möchten, verwenden Sie den Wert
none:vsidlc -c path_to_catalog -o output_directory -p --rust-formatter none
Nächste Schritte
Nachdem Sie die Middleware generiert haben, lesen Sie Geschäftslogik implementieren.