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 文件。
此文件必须定义一个用于对您的 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中,以便构建系统可以将它们复制到编译沙盒中。
后续步骤
如需继续实现服务架构,请参阅定义服务架构。