定義訊息和 RPC 服務

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 會識別具有輸入和輸出訊息類型 (分別為 SetSeatHeatingRequestSetSeatHeatingResponse) 的單一 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,建構系統就能將這些檔案複製到編譯沙箱。

後續步驟

如要繼續實作服務架構,請參閱「定義服務架構」。