Nachrichten und RPC-Dienste definieren

Das Typsystem von VSIDLC arbeitet auf zwei Ebenen: Protobuf und VSIDL. Mit Protobuf werden Nachrichten definiert, die zwischen dem Publisher und den von VSIDL definierten Abonnenten ausgetauscht werden. VSIDL verweist auf Typen, die von Protobuf deklariert wurden.

Auf dieser Seite wird erläutert, wie Sie Nachrichten und Remote-Prozeduraufruf (RPC)-Methoden definieren, um Anfragen aufzurufen und darauf zu antworten.

Nachrichten definieren

In diesem Abschnitt wird erläutert, wie Nachrichten in VSIDL und Protobuf definiert werden.

Im folgenden Codebeispiel wird eine TirePressure-Nachricht definiert:

syntax = "proto3";

package com.android.sdv.sample.vsidl;

message TirePressure {
  uint32 pressure = 1;
}

RPC-Dienste definieren

In Protobuf definiert ein RPC-Dienst eine Reihe von Methoden, die remote aufgerufen werden können, als wären es lokale Funktionsaufrufe. Im folgenden Beispiel werden Nachrichten- und Antwortnachrichtentypen sowie die RPC-Dienstmethode definiert, die zum Senden einer Anfrage und zum Empfangen einer Antwort verwendet wird:

syntax = "proto3";

package com.google.sdv;

enum SeatHeatingLevel {
  OFF = 0;
  LOW = 1;
  HIGH = 2;
}

// Request to set seat heating
message SetSeatHeatingRequest {
  enum Seat {
    DRIVER = 0;
    PASSENGER = 1;
  }
  Seat seat = 1;
  SeatHeatingLevel level = 2;
}

// Response to setting seat heating
message SetSeatHeatingResponse {
  bool success = 1;
}

// Seat heating service
service SeatHeatingService {
  rpc SetSeatHeating (SetSeatHeatingRequest) returns (SetSeatHeatingResponse);
}

Wobei:

  • service identifiziert eine Sammlung verwandter RPC-Methoden.
  • rpc identifiziert eine einzelne RPC-Methode mit Eingabe- und Ausgabenachrichtentypen (SetSeatHeatingRequest bzw. SetSeatHeatingResponse).

Build-System-Integration konfigurieren

Damit vsidlc Ihre Protobuf-Definitionen erkennen und das Android-Build-System sie kompilieren kann, müssen Sie eine Android.bp-Datei in den obersten Ordner Ihres Katalogverzeichnisses einfügen.

In dieser Datei muss ein rust_protobuf-Ziel definiert sein, das Ihre Protobuf-Dateien (mit der Erweiterung .proto) gruppiert. Jede Datei in Ihrem Katalog muss in einer Dateigruppe berücksichtigt werden. Wenn in der Datei Android.bp mehrere Dateigruppen vorhanden sind, verwendet vsidlc die erste.

Das folgende Beispiel zeigt ein typisches rust_protobuf-Ziel für einen VSIDL-Katalog:

  rust_protobuf {
      name: "liboem_vehicle_messages",
      crate_name: "oem_vehicle_messages",
      source_stem: "oem_vehicle_messages_source",
      protos: [
          "**/*.proto",
      ],
      rustlibs: [
          "libvsidl_v1_proto_rs",
      ],
      proto_flags: [
          "-I external/protobuf/src",
      ],
      apex_available: [
          "//apex_available:platform",
          "//apex_available:anyapex",
      ],
      vendor_available: true,
      product_available: true,
      min_sdk_version: "35",
  }

  filegroup {
      name: "catalog_oem_vehicle_messages",
      srcs: ["**/*"],
  }

Wobei:

  • name: Eine eindeutige Kennung für das Build-Ziel. Standardmäßig beginnt diese mit lib.
  • crate_name: Der Name der generierten Rust-Crate.
  • protos: Eine Liste aller Protobuf-Dateien im Katalog. Globs wie **/*.proto werden unterstützt.
  • rustlibs: Muss libvsidl_v1_proto_rs enthalten, um die Standard-SDV-Annotationen und -Typen bereitzustellen.
  • proto_flags: Wird verwendet, um Include-Pfade anzugeben. -I external/protobuf/src ist oft erforderlich, um Standard-Protobuf-Typen aufzulösen.
  • min_sdk_version: Auf "35" (Android 15) festgelegt, um die Kompatibilität mit den entsprechenden SDV-Plattform-APIs und den Anforderungen an die Rust-Toolchain zu deklarieren.
  • filegroup: Für die Ermittlung zur Build-Zeit erforderlich. Fügen Sie alle VSIDL-, Protobuf- und Android.bp-Dateien in srcs ein, damit das Build-System sie in die Kompilierungs-Sandbox kopieren kann.

Nächste Schritte

Informationen zum weiteren Implementieren Ihrer Dienstarchitektur finden Sie unter Dienstarchitektur definieren.