Android构建中如何在生成classes.dex后添加自定义Gradle任务
问题分析与解决方案
首先,你遇到的核心问题是**dexRelease/dexDebug任务在新版Android Gradle Plugin(AGP)中已经不再执行**,这也是你的后续任务没触发的根本原因。
为什么dexRelease/dexDebug没运行?
从AGP 3.0.0开始,Google重构了dex编译流程,原来的dex<Variant>系列任务被废弃,不再参与构建流程。取而代之的是拆分后的两个核心任务:
dexBuilder<Variant>:负责将单个模块的字节码编译为dex文件mergeDex<Variant>:负责将所有模块的dex文件合并为最终的dex集合(也就是你在app/build/intermediates/dex/debug路径下看到的文件)
所以你监听的旧任务根本不会被Gradle调用,自然无法触发后续的taskAfterDex。
正确的任务选择
如果你需要在最终的classes.dex完全生成后执行自定义逻辑,应该监听mergeDex<Variant>任务(比如mergeDexDebug、mergeDexRelease)。这个任务是构建流程中处理dex的最后一步,执行完成后,目标路径下的dex文件就已经准备就绪了。
修复你的Gradle配置
除了任务选错,你的代码还有一个小问题:你注释掉了task.finalizedBy taskAfterDex这行关键代码,即使旧任务能运行,后续任务也不会触发。这里是修正后的配置:
// 定义你要在dex生成后执行的任务 task taskAfterDex(type: Exec) { println "taskAfterDex configured" doLast { println "taskAfterDex executed" // 这里添加你的业务逻辑,比如计算CRC def targetDexPath = "${project.buildDir}/intermediates/dex/debug/classes.dex" println "Target dex file path: $targetDexPath" // 示例:执行CRC计算命令(根据你的需求替换) // commandLine 'sh', '-c', "crc32 $targetDexPath" } } // 动态监听mergeDex系列任务,设置后续执行依赖 tasks.whenTaskAdded { task -> // 匹配所有mergeDex开头的任务(覆盖debug/release等变体) if (task.name.startsWith('mergeDex')) { println "-Detected dex merge task: ${task.name}" task.finalizedBy taskAfterDex } }
这里用tasks.whenTaskAdded替代tasks.all更可靠,因为AGP的变体任务是动态生成的,whenTaskAdded能确保捕获到所有相关任务。
验证方法
执行./gradlew assembleDebug(或assembleRelease),查看控制台日志:
- 会输出
-Detected dex merge task: mergeDexDebug - 当
mergeDexDebug执行完成后,会看到taskAfterDex executed的输出
这就说明你的自定义任务已经正确关联并触发了。
内容的提问来源于stack exchange,提问作者Arjun T Raj
相关产品推荐
相关产品推荐

