自动更新目录和 LSP 集成

软件定义型汽车 (SDV) 平台在整个代码库中包含许多 VSIDL 目录。CATALOG_UPDATE 文件为每个目录提供集中式配置,从而实现自动化更新和 IDE 集成。

CATALOG_UPDATE 文件的作用

CATALOG_UPDATE 文件主要有以下两种用途:

  1. 自动更新:当编译器或依赖项发生更改时,该文件允许 regenerator 工具查找并重新编译系统中的所有目录。
  2. 语言服务器协议 (LSP) 支持:VSIDL 语言服务器使用此文件来发现目录根并解析依赖项。这样一来,您就可以使用“前往定义”等功能,并针对其他目录中定义的类型进行自动补全和实时验证。

配置目录

如需为 VSIDL 目录启用自动更新和 LSP 支持,请在目录的根目录中创建一个 CATALOG_UPDATE 文件。此文件是一个文本 protobuf 文件。

目录配置字段

  • output_path(字符串,可选):从目录根目录到应放置生成的中间件代码的目录的相对路径。
  • dependency_catalog_paths(重复字符串):指向其他目录目录的相对路径列表。LSP 服务器使用这些路径来解析外部类型。
  • vsidlc_gen_args(字符串,可选):传递给 vsidlc 的实参。LSP 服务器会检查这些实参,以应用正确的验证规则(例如 "--apex")。
  • prebuilts_output_path(字符串,可选):生成的运行时配置预构建件的路径。
  • prebuilts_filegroup(字符串,可选):预构建的 Soong filegroup 名称。

配置示例

# proto-file: //system/software_defined_vehicle/tools/regenerator/proto/catalog.proto
# proto-message: Catalog

output_path: ".."
dependency_catalog_paths: "../../../../../automotive_services/diagnostics/vsidl/v1"
vsidlc_gen_args: "--apex"

为什么需要自动更新

手动维护每个目录的生成代码存在以下几个问题:

  1. 编译器更新:当编译器更新并包含 bug 修复或新功能时,所有未被 Android.bp 文件中的 genrule 涵盖的生成代码和文件都应刷新,以保持一致性。
  2. 依赖项管理:基础目录中的更改通常需要重新生成下游目录。
  3. 准确性:自动更新可降低指定路径和依赖项时出现人为错误的风险。

运行再生器工具

regenerator 工具会从 SDV 根目录开始遍历目录树,并查找名为 CATALOG_UPDATE 的文件。

如需更新所有已配置的目录,请执行以下操作:

  1. 构建工具:

    m regenerator
    
  2. 运行该工具:

    regenerator
    

    (可选)针对特定目录以递归方式运行: console regenerator --root /path/to/directory

该工具会更新生成的文件并执行完整 build (m droid),以验证更改是否与系统的其余部分兼容。