VSIDLC 的型別系統有兩個層級:Protobuf 和 VSIDL。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 檔案。
這個檔案必須定義 rust_protobuf 目標,將您的 protobuf 檔案 (副檔名為 .proto) 分組。目錄中的每個檔案都必須在檔案群組中列出。如果 Android.bp 檔案中有多個檔案群組,vsidlc 會採用第一個。
以下範例顯示 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:建構目標的專屬 ID。按照慣例,這會以lib開頭。crate_name:產生的 Rust Crate 名稱。protos:目錄中的所有 protobuf 檔案清單。支援類似**/*.proto的 glob。rustlibs:必須包含libvsidl_v1_proto_rs,才能提供標準 SDV 註解和類型。proto_flags:用於指定包含路徑。通常需要-I external/protobuf/src才能解析標準 protobuf 型別。min_sdk_version:設為"35"(Android 15),以宣告與對應的 SDV 平台 API 和 Rust 工具鍊需求相容。filegroup:建構時探索功能時必須使用。將每個 VSIDL、protobuf 和Android.bp檔案都納入srcs,建構系統就能將這些檔案複製到編譯沙箱。
後續步驟
如要繼續實作服務架構,請參閱「定義服務架構」。