You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:28:07