Android Gradle7.0+ 如何配置自定义Copy任务在构建流程中自动执行
问题解答
1. 自定义任务设置依赖的正确方式
AGP 7.0+ 配套 Gradle 7.x 后使用了新的变体API,你之前注释中的写法失效主要是两个原因:
- 硬编码任务路径
:app:processDebugResources兼容性差,且直接调用getByPath会触发任务提前配置,违反Gradle配置缓存规则 - 在
onVariants回调中直接访问build任务属于跨阶段引用,无法正确绑定依赖
正确的依赖绑定规则如下:
- 所有和变体相关的任务依赖,都通过回调传入的
variant对象获取对应任务的懒加载提供者,不要硬编码任务名 - 使用
configure方法对目标任务进行配置,避免提前实例化任务 - 多构建类型/产品风味场景下,给自定义任务名增加变体前缀,避免重名冲突
2. 绑定的目标构建任务选择
如果你需要Copy任务在assembleDebug/assembleRelease执行时自动触发,直接绑定到对应变体的assemble任务即可;如果需要复制的文件参与后续资源编译/打包流程,可以绑定到更早的processResources任务。
可用的修正后脚本
androidComponents { // 仅debug构建生效,要全量生效替换为 selector().all() onVariants(selector().withBuildType("debug"), { variant -> // 任务名增加变体前缀,避免多构建类型冲突 def copyTestTask = tasks.register("copy${variant.name.capitalize()}Test", Copy) { from(file('../../local/test.txt')) into(buildDir) // 日志放到doFirst中,仅任务执行时输出,避免配置阶段冗余打印 doFirst { logger.lifecycle("DEST: $buildDir") } } // 绑定到当前变体的assemble任务,assemble<Variant>执行时自动触发复制 variant.tasks.assemble.configure { assembleTask -> assembleTask.dependsOn(copyTestTask) } // 如果需要更早执行,替换为绑定资源处理任务即可 // variant.tasks.processResources.configure { processResTask -> // processResTask.dependsOn(copyTestTask) // } }) }
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

