Middleware generieren

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:

VSIDLC-Ein- und -Ausgaben

Abbildung 1 : VSIDLC-Ein- und -Ausgaben.

Im Folgenden finden Sie eine Erläuterung des Diagramms:

  1. 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 definieren rust_protobuf-Build-Ziele für alle Proto-Dateien im Katalog. VSIDLC verwendet den in diesen Zielen angegebenen crate_name, um auf die generierten Protobuf-Nachrichtentypen in Rust zu verweisen.
  2. Führen Sie VSIDLC aus, um die folgenden Dateien auszugeben:

    • Android.bp-Dateien werden im Ordner jedes Dienstpakets generiert. Wenn Sie --genrule festlegen, generieren diese Ziele während des Build-Prozesses aktuelle Rust-Dateien und enthalten die erforderlichen rust_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 eine diagnostics_declaration vorhanden ist. Sie enthalten die erforderlichen Bindungen für UDS-basierte Diagnosen.

    • Bereitstellungs- und Sicherheitskonfigurationen werden mit dem Flag --apex generiert. Diese werden in den Verzeichnissen apex/ und configs/ platziert und enthalten Orchestrierungsdateien (.textproto) und Sicherheitsrichtlinien (Berechtigungen), die für die Kommunikation zwischen Diensten erforderlich sind.

    • Mit dem Flag --services wird ein Dienst-Boilerplate generiert. Dieser wird in einem Verzeichnis services/ platziert und enthält ein Rust-Anwendungsskelett, einschließlich einer main.rs-Datei, um die Implementierung zu beschleunigen.

VSIDLC ausführen

So führen Sie VSIDLC aus:

  1. Wenn Sie Ihre Umgebung noch nicht eingerichtet haben, führen Sie source build/envsetup.sh aus.

  2. Führen Sie den folgenden Befehl aus, um VSIDLC zu erstellen:

    m vsidlc
    
  3. Prüfen Sie, ob Ihr VSIDL-Katalogverzeichnis die erforderlichen Build-, Protobuf- und VSIDL-Dateien enthält.

  4. Führen Sie den Befehl vsidlc aus:

    vsidlc -c path_to_catalog -o output_directory -p
    

    Wobei:

    • -c path_to_catalog gibt den Pfad zum Haupt katalogverzeichnis an.
    • -o output_directory gibt das übergeordnete Verzeichnis an in dem das generated_rs Ausgabeverzeichnis erstellt wird.
    • (optional) --apex generiert Orchestrierungs- und Sicherheitskonfigurationsartefakte.
    • (optional) --services generiert ein Rust-Anwendungsskelett für den Schnellstart.
    • (optional) -p löscht vorhandene generierte Verzeichnisse (z. B. generated_rs und gegebenenfalls apex, configs oder services), bevor neue Dateien generiert werden.
    • (optional) --genrule generiert Android.bp-Genrules anstelle von Rust-Code. Die Genrules generieren den erforderlichen Rust-Code im laufenden Betrieb, wenn Sie m ausführen, um zu vermeiden, dass generierte Artefakte unter Versionsverwaltung gestellt werden.

    Es wird ein Verzeichnis generated_rs mit einer Android.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:

Beispiel für VSIDLC-Abhä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-please
    
  • Wenn 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.