生成中间件

车辆服务接口定义语言 (VSIDL) 中间件定义了一组 Rust 库,这些库在软件定义的车辆 (SDV) 通信堆栈之上创建了一个抽象层,以简化 SDV 生态系统的使用。中间件为服务之间的通信和交互提供了一种标准化方式。VSIDLC 生成的代码和您的自定义代码都会使用这些库。

车辆服务接口定义语言编译器 (VSIDLC) 会验证定义,生成包含 genrule 目标 (target) 的 build 文件 (Android.bp),以便在构建流程中生成 Rust 中间件代码,并从目录中的 VSIDL 和 protobuf 文件创建部署配置。图 1 显示了 VSIDLC 的输入和 VSIDLC 生成的输出:

VSIDLC 输入和输出

图 1. VSIDLC 输入和输出。

下图的说明如下:

  1. 作为输入,您需要提供以下文件,这些文件整理在称为目录的目录中:

    • Proto 文件(扩展名为 .proto)包含由 VSIDL 定义的服务单元之间交换的数据结构。
    • VSIDL 文件(扩展名为 .vsidl)用于定义服务包、服务单元和单元类型所有权。
    • 每个目录中的 Android.bp 文件都会为目录中的所有 proto 文件定义 rust_protobuf build 目标。VSIDLC 使用这些目标中指定的 crate_name 在 Rust 中引用生成的 protobuf 消息类型。
  2. 您运行 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,请执行以下操作:

  1. 如果您尚未设置环境,请运行 source build/envsetup.sh

  2. 运行以下命令以构建 VSIDLC:

    m vsidlc
    
  3. 确保您的 VSIDL 目录包含必要的 build、protobuf 和 VSIDL 文件。

  4. 运行 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,以及适用的 apexconfigsservices)。
    • (可选)--genrule 生成 Android.bp genrule 而不是 Rust 代码。 运行 m 时,genrule 会动态生成必要的 Rust 代码,以避免将生成的制品置于版本控制之下。

    系统会创建一个 generated_rs 目录,其中包含 Android.bp 和生成的中间件文件。此目录位于与您定义的服务包的完全限定名称对应的子目录中。

处理依赖关系

默认情况下,VSIDLC 仅为主目录生成代码,而不为依赖项目录生成代码。如果您的目录使用其他目录中定义的类型或服务单元,请使用 -d 标志指定每个依赖目录的路径:

vsidlc -c path_to_catalog -o output_directory -d dep1_path -d dep2_path ...

您必须为整个依赖关系图提供路径,包括传递依赖关系(依赖关系的依赖关系)。例如,假设您有以下目录依赖树:

VSIDLC 依赖树示例

图 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_PATHRUSTFMT_TOML_PATH 环境变量。如需更改 Rust 输出的默认格式,请将 --rust-formatter 选项与 pretty-pleasenone 搭配使用:

  • 如需将输出格式更改为 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
    

后续步骤

生成中间件后,请参阅实现业务逻辑