Android Studio中Gradle无目标执行时Jar生成文件丢失问题排查
这坑我之前踩过,核心是没搞清楚Gradle的任务执行逻辑和Android插件任务的触发条件,咱们一步步拆解:
为什么执行./gradlew时文件没生成?
1. 配置阶段的打印误导了你
你写的println("Running jar from gradle with shell script.")是直接放在translationsTask的配置代码块里的——Gradle在配置阶段(不管任务最终会不会实际运行)都会执行这段代码。所以你看到的“脚本看似在运行”其实只是配置阶段的输出,真正执行./test.sh的Exec任务根本没被触发!
2. preBuild任务的触发有条件
preBuild是Android插件为每个构建变体(比如debug、release)生成的任务,只有当你执行触发变体构建的任务时(比如指定taskname、Android Studio的运行/构建操作,或者assembleDebug这类变体任务),preBuild才会被加入执行流程。而直接跑./gradlew不指定任务时,Gradle会执行根项目的默认任务——如果你的项目没修改过默认配置,这个默认任务大概率不会触发preBuild,自然也就不会执行你的翻译任务。
怎么解决?
给你几个可行的方案,按需选择:
方案1:让翻译任务绑定到通用构建任务
如果你希望只要执行构建相关操作(包括./gradlew默认任务)都能生成翻译文件,可以把任务依赖绑定到build任务,或者直接修改默认任务:
// 方式1:让根项目的build任务依赖你的翻译任务 build.dependsOn(translationsTask) // 方式2:直接设置根项目默认任务,确保跑./gradlew时会执行翻译任务+默认构建 defaultTasks 'translationsTask', 'assembleDebug'
方案2:修复打印逻辑,避免混淆
把打印代码放到doFirst块里,这样只有任务真正执行时才会打印,再也不会被配置阶段的输出误导:
task translationsTask(type: Exec) { workingDir rootDir commandLine './test.sh' doFirst { println("Running jar from gradle with shell script.") } }
方案3:绑定到所有变体的preBuild
如果你只想在变体构建时触发,但希望默认任务也能覆盖,可以把翻译任务绑定到所有变体的preBuild:
android { // ... 你的其他Android配置 applicationVariants.all { variant -> variant.preBuild.dependsOn(translationsTask) } }
验证方法
可以跑./gradlew tasks --all查看默认任务是什么,或者用./gradlew translationsTask --dry-run模拟任务执行,确认你的翻译任务是否会被触发。
内容的提问来源于stack exchange,提问作者EsbenG

