车辆服务接口定义语言 (VSIDL) 中间件定义了一组 Rust 库,这些库在软件定义的车辆 (SDV) 通信堆栈之上创建了一个抽象层,以简化 SDV 生态系统的使用。中间件为服务之间的通信和交互提供了一种标准化方式。VSIDLC 生成的代码和您的自定义代码都会使用这些库。
车辆服务接口定义语言编译器 (VSIDLC) 会验证定义,生成包含 genrule 目标 (target) 的 build 文件 (Android.bp),以便在构建流程中生成 Rust 中间件代码,并从目录中的 VSIDL 和 protobuf 文件创建部署配置。图 1 显示了 VSIDLC 的输入和 VSIDLC 生成的输出:
图 1. VSIDLC 输入和输出。
下图的说明如下:
作为输入,您需要提供以下文件,这些文件整理在称为目录的目录中:
- Proto 文件(扩展名为
.proto)包含由 VSIDL 定义的服务单元之间交换的数据结构。 - VSIDL 文件(扩展名为
.vsidl)用于定义服务包、服务单元和单元类型所有权。 - 每个目录中的
Android.bp文件都会为目录中的所有 proto 文件定义rust_protobufbuild 目标。VSIDLC 使用这些目标中指定的crate_name在 Rust 中引用生成的 protobuf 消息类型。
- Proto 文件(扩展名为
您运行 VSIDLC 以输出以下文件:
Android.bp文件在每个服务包的文件夹中生成。如果您设置了--genrule,这些目标会在构建流程中生成最新的 Rust 文件,并包含必要的rust_protobuf库依赖项。系统会为每个服务软件包生成
service_bundle.rs文件,其中包含用于与中间件组件交互的主要struct和函数。系统会为软件包拥有的每个 RPC 服务生成
lib.rs文件,并将其放置在以 RPC 服务命名的子文件夹中。这些文件包括:Interface特征实现了服务器端逻辑。Client结构体用于调用 RPC 服务。如果 VSIDL 文件中存在
diagnostics_declaration,则会生成diagnostics.rs文件,从而为基于 UDS 的诊断提供必要的绑定。使用
--apex标志时,系统会生成部署和安全配置。这些文件位于apex/和configs/目录中,包括服务到服务通信所需的编排.textproto文件和安全政策(权限)。使用
--services标志时,系统会生成服务样板。此文件位于services/目录中,包含 Rust 应用框架(包括main.rs文件),可帮助您快速开始实现。
运行 VSIDLC
如需运行 VSIDLC,请执行以下操作:
如果您尚未设置环境,请运行
source build/envsetup.sh。运行以下命令以构建 VSIDLC:
m vsidlc确保您的 VSIDL 目录包含必要的 build、protobuf 和 VSIDL 文件。
运行
vsidlc命令:vsidlc -c path_to_catalog -o output_directory -p其中:
-c path_to_catalog用于标识主目录的路径。-o output_directory用于标识创建generated_rs输出目录的父目录。- (可选)
--apex生成编排和安全配置制品。 - (可选)
--services生成一个快速入门 Rust 应用框架。 - (可选)
-p在生成新文件之前,删除现有的已生成目录(例如generated_rs,以及适用的apex、configs或services)。 - (可选)
--genrule生成Android.bpgenrule 而不是 Rust 代码。 运行m时,genrule 会动态生成必要的 Rust 代码,以避免将生成的制品置于版本控制之下。
系统会创建一个
generated_rs目录,其中包含Android.bp和生成的中间件文件。此目录位于与您定义的服务包的完全限定名称对应的子目录中。
处理依赖关系
默认情况下,VSIDLC 仅为主目录生成代码,而不为依赖项目录生成代码。如果您的目录使用其他目录中定义的类型或服务单元,请使用 -d 标志指定每个依赖目录的路径:
vsidlc -c path_to_catalog -o output_directory -d dep1_path -d dep2_path ...
您必须为整个依赖关系图提供路径,包括传递依赖关系(依赖关系的依赖关系)。例如,假设您有以下目录依赖树:
图 2. VSIDLC 依赖树示例。
如需为树中的每个目录生成中间件,您必须运行以下命令:
| 目标目录 | 依赖项 | 命令 |
|---|---|---|
| SDV 核心目录 | N/A | vsidlc -o ./generated -c ./path/to/sdv_core_catalog |
| 诊断目录 | SDV 核心目录 | vsidlc -o ./generated -c ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
| SOMEIP 目录 | 诊断目录、SDV 核心目录 | vsidlc -o ./generated -c ./path/to/someip_catalog -d ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
| OEM 目录 | 诊断目录、SOMEIP 目录、(传递性)SDV 核心目录 | vsidlc -o ./generated -c ./path/to/oem_catalog -d ./path/to/someip_catalog -d ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
设置 Rust 输出格式
默认情况下,VSIDL 使用 rustfmt 设置 Rust 输出的格式。为了使默认值正常运行,请设置 $ANDROID_BUILD_TOP 环境变量或 RUSTFMT_PATH 和 RUSTFMT_TOML_PATH 环境变量。如需更改 Rust 输出的默认格式,请将 --rust-formatter 选项与 pretty-please 或 none 搭配使用:
如需将输出格式更改为 crate
prettyplease,请使用pretty-please值:vsidlc -c path_to_catalog -o output_directory -p --rust-formatter pretty-please如需将输出格式更改为“无”,请使用
none值:vsidlc -c path_to_catalog -o output_directory -p --rust-formatter none
后续步骤
生成中间件后,请参阅实现业务逻辑。