Android项目中如何正确为assembleRelease任务添加前置依赖?
Android Gradle:如何在assembleRelease前执行自定义任务?
我帮你分析下你之前尝试的两种方法为什么没生效,再给你正确的实现方式:
先说说你之前的问题
- 第一种方法的问题:你用了
<<这种旧的Groovy语法(Gradle 5.x之后已经不推荐使用,现在标准写法是doLast),另外whenTaskAdded的监听方式虽然理论上可行,但不如直接定位到assembleRelease任务设置依赖更可靠,有时候可能因为任务创建时机的问题导致监听失效。 - 第二种方法完全用错了地方:
dependencies块是用来声明项目的依赖库(比如jar、aar、远程依赖)的,根本不是用来配置任务依赖的,所以这种写法完全不会触发你的自定义任务。
正确的实现方式
下面给你两种可靠的写法,任选一种都能解决问题:
写法一:直接给assembleRelease任务加依赖
这种方式适合只针对assembleRelease单个任务的场景:
// 1. 定义你的自定义任务,用标准的doLast来写执行逻辑 task preBuild1 { doLast { println 'Copying correct build.gradle to the foo library' copy { from "../../androidRelated/gradle/foo" into "foo" } } } // 2. 找到assembleRelease任务,让它依赖preBuild1 // 这样执行assembleRelease时,会先跑完preBuild1再执行自身 tasks.named('assembleRelease') { assembleReleaseTask -> assembleReleaseTask.dependsOn(preBuild1) } // 下面是你原本的Android配置和依赖,保持不变 android { // 你的compileSdk、defaultConfig等配置... } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation(name: 'AudienceNetwork', ext:'aar') implementation(name: 'GoogleAIDL', ext:'aar') implementation(name: 'GooglePlay', ext:'aar') // 其他依赖... }
写法二:针对所有Release变体的assemble任务
如果你项目里有productFlavor(比如免费版、付费版),会生成assembleFreeRelease、assemblePaidRelease这类任务,用这种方式可以让自定义任务在所有Release变体的assemble任务前执行:
task preBuild1 { doLast { println 'Copying correct build.gradle to the foo library' copy { from "../../androidRelated/gradle/foo" into "foo" } } } android { // 你的Android基础配置... // 遍历所有变体,给Release类型的assemble任务加依赖 applicationVariants.all { variant -> if (variant.buildType.name == 'release') { variant.assembleProvider.get().dependsOn(preBuild1) } } } // 依赖部分保持不变 dependencies { // ... 你的依赖声明 }
验证方式
执行gradle assembleRelease的时候,你应该能先看到控制台打印出Copying correct build.gradle to the foo library,然后才会开始正常的Release构建流程。
内容的提问来源于stack exchange,提问作者Kokizzu
相关产品推荐
相关产品推荐

