メッセージと RPC サービスを定義する

VSIDLC の型システムは、Protobuf と VSIDL の 2 つのレベルで動作します。Protobuf は、VSIDL で定義されたパブリッシャーとサブスクライバーの間で交換されるメッセージを定義するために使用されます。VSIDL は、protobuf で宣言された型を参照します。

このページでは、リクエストの呼び出しと応答に使用するメッセージとリモート プロシージャ コール(RPC)メソッドを定義する方法について説明します。

メッセージを定義する

このセクションでは、VSIDL と protobuf でメッセージを定義する方法について説明します。

次のコードサンプルでは、TirePressure メッセージを定義しています。

syntax = "proto3";

package com.android.sdv.sample.vsidl;

message TirePressure {
  uint32 pressure = 1;
}

RPC サービスを定義する

protobuf では、RPC サービスは、ローカル関数呼び出しのようにリモートで呼び出すことができる一連のメソッドを定義します。次の例では、リクエストとレスポンスのメッセージ タイプと、リクエストの送信とレスポンスの受信に使用する RPC サービス メソッドを定義しています。

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);
}

ここで

  • service は、関連する RPC メソッドのコレクションを識別します。
  • rpc は、入力メッセージ タイプと出力メッセージ タイプ(それぞれ SetSeatHeatingRequestSetSeatHeatingResponse)を持つ単一の RPC メソッドを識別します。

ビルドシステムの統合を構成する

vsidlc が protobuf 定義を検出して Android ビルドシステムでコンパイルできるようにするには、カタログ ディレクトリの最上位フォルダに Android.bp ファイルを含める必要があります。

このファイルでは、protobuf ファイル(.proto 拡張子付き)をグループ化する rust_protobuf ターゲットを定義する必要があります。 カタログ内のすべてのファイルは、filegroup に含める必要があります。Android.bp ファイルに複数の filegroup がある場合、vsidlc は最初の filegroup を使用します。

次の例は、VSIDL カタログの一般的な rust_protobuf ターゲットを示しています。

  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: ["**/*"],
  }

ここで

  • name: ビルドターゲットの一意の識別子。慣例により、lib で始まります。
  • crate_name: 生成された Rust クレートの名前。
  • protos: カタログ内のすべての protobuf ファイルのリスト。**/*.proto などの glob がサポートされています。
  • rustlibs: 標準の SDV アノテーションと型を提供するには、libvsidl_v1_proto_rs を含める必要があります。
  • proto_flags: インクルード パスを指定するために使用します。標準の protobuf 型を解決するには、-I external/protobuf/src が必要になることがよくあります。
  • min_sdk_version: 対応する SDV プラットフォーム API と Rust ツールチェーンの要件との互換性を宣言するには、"35"(Android 15)に設定します。
  • filegroup: ビルド時の検出に必要です。ビルドシステムがコンパイル サンドボックスにコピーできるように、すべての VSIDL、protobuf、Android.bp ファイルを srcs に含めます。

次のステップ

サービス アーキテクチャの実装を続行するには、サービス アーキテクチャを定義するをご覧ください。