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は、入力メッセージ タイプと出力メッセージ タイプ(それぞれSetSeatHeatingRequestとSetSeatHeatingResponse)を持つ単一の 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に含めます。
次のステップ
サービス アーキテクチャの実装を続行するには、サービス アーキテクチャを定義するをご覧ください。