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

运行重新生成器工具

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

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

  1. 构建工具:

    m regenerator
    
  2. 运行该工具:

    regenerator
    

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

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