AOSP构建中如何让下载规则优先于依赖模块执行?
解决AOSP构建中genrule生成文件被提前检查的问题
核心问题原因
AOSP的SoC构建系统在分析阶段(analysis phase)会提前校验android_library_import/android_app_import引用的文件是否存在,而genrule的执行是在执行阶段(execution phase),因此会出现文件未生成就被检查的错误。
具体解决步骤
1. 用filegroup封装genrule输出(推荐)
不要让消费者规则直接引用genrule的输出文件,先通过filegroup包装genrule的产物,再让消费者依赖这个filegroup。示例代码:
genrule { name: "download_artifacts", tools: ["download_script.sh"], cmd: "$(location download_script.sh) --output $(out_dir)", out: [ "libs/foo.aar", "libs/bar.jar", ], } filegroup { name: "downloaded_libs", srcs: [":download_artifacts"], } android_library_import { name: "foo_lib", aars: [":downloaded_libs"], // 其他配置项 }
2. 关闭消费者规则的提前校验
如果filegroup方式不生效,可给android_library_import/android_app_import添加validate: false属性,关闭构建系统的提前文件校验:
android_library_import { name: "foo_lib", aars: [":download_artifacts"], validate: false, // 其他配置项 }
注意:该属性会关闭所有文件存在性校验,需确保genrule逻辑稳定,避免实际构建时真的缺失文件。
3. 用隐式依赖关联genrule与预构建规则
通过implicit_deps字段让预构建规则明确依赖genrule,强制构建系统调整执行顺序:
genrule { name: "download_artifacts", tools: ["download_script.sh"], cmd: "$(location download_script.sh) --output $(out_dir)/libs && echo \"$(out_dir)/libs/foo.aar: $(location download_script.sh)\" > $(out_dir)/download.dep", out: [ "libs/foo.aar", ], depfile: "download.dep", } prebuilt_library { name: "foo_lib", srcs: ["$(out_dir)/libs/foo.aar"], implicit_deps: [":download_artifacts"], export_include_dirs: ["."], }
关键注意事项
- 确保genrule的
out字段准确列出所有生成文件,构建系统依赖该列表追踪产物。 - 下载脚本的输出路径必须与genrule的
out定义完全匹配,避免路径不匹配导致的文件找不到问题。 - 优先使用
filegroup方案,这是最符合SoC构建系统设计规范的做法,能减少潜在的构建异常。
内容的提问来源于stack exchange,提问作者copolii
相关产品推荐
相关产品推荐

