定义消息和 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 文件。

此文件必须定义一个用于对您的 protobuf 文件(扩展名为 .proto)进行分组的 rust_protobuf 目标。 目录中的每个文件都必须在文件组中进行说明。如果 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:build 目标的唯一标识符。按照惯例,此标识符以 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 中,以便构建系统可以将它们复制到编译沙盒中。

后续步骤

如需继续实现服务架构,请参阅定义服务架构