Gradle没改代码却构建慢,主因是每次仍执行完整生命周期:初始化(解析settings.gradle)、配置(重算依赖图、执行build.gradle脚本)、执行(受输入哈希/插件全量运行影响);配置缓存未启用是最常见原因。

Gradle 没改代码却还要等很久,大概率不是在编译源码,而是在重复执行配置、解析依赖或校验输入——这些动作不依赖代码变更,但每次构建都会触发。
为什么没改代码也要重新走完整流程
Gradle 的构建生命周期分三阶段:初始化 → 配置 → 执行。即使 src/ 下一行没动,以下环节仍会照常运行:
-
settings.gradle和所有build.gradle脚本会被重新解析(尤其 Kotlin DSL 中的逻辑表达式、project.afterEvaluate回调) - 所有模块的依赖图会被重新计算,哪怕只改了
gradle.properties里一个空格 - AGP(Android Gradle Plugin)会检查
AndroidManifest.xml、资源文件、ProGuard 规则等输入哈希,任一文件 mtime 变更就触发重执行 - 某些插件(如
kapt、lint、detekt)默认不参与增量判断,每次构建都全量跑
配置缓存未启用是最常见原因
org.gradle.configuration-cache=true 是解决“没改代码也慢”的关键开关。它把配置阶段的结果序列化缓存,后续构建直接复用,跳过脚本解析和任务图生成。但注意:
- 必须搭配
org.gradle.parallel=true和org.gradle.caching=true才能发挥效果 - Kotlin DSL 中若用了
System.getenv()、new Date()或反射访问 project 属性,会导致缓存失效并报错 - AGP 8.0+ 才对配置缓存有较完善支持;老版本开启后可能直接构建失败
- 首次启用时加
--configuration-cache-problems=warn查兼容性问题
依赖解析卡在“Resolving dependencies…”
这个阶段耗时长,往往和网络或仓库配置有关,而非代码本身:
- 默认从
https://repo.maven.apache.org/maven2/和https://dl.google.com/dl/android/maven2/拉包,国内直连极慢 - 项目中若存在
1.2.+这类动态版本号,Gradle 会强制检查远程最新版,每次构建都发 HTTP HEAD 请求 -
./gradlew --refresh-dependencies被误加进 IDE 运行配置或 CI 脚本,导致缓存完全失效 - 本地
~/.gradle/caches/modules-2/metadata-目录损坏,触发反复重试
Daemon 失效导致冷启动
如果 ./gradlew --status 显示没有活跃 daemon,或每次构建前都看到 “Starting Daemon…”,说明你在反复启动 JVM:
- IDEA 或 Android Studio 默认用内嵌 Gradle 实例,和命令行 daemon 不共享,需在 Settings → Build → Build Tools → Gradle 中勾选 “Use Gradle from wrapper” 并关闭 “Create separate daemon per project”
- CI 环境中执行
gradle --stop或pkill -f gradle会杀死 daemon,应改用构建缓存 + 远程 cache server - JVM 参数不合理(如
-Xmx512m)导致频繁 GC,daemon 自动退出,表现为构建中途卡住几秒后重启
真正耗时的往往不是编译本身,而是那些“看不见的准备动作”。先确认是哪一层在拖慢你——是配置阶段卡顿?还是依赖解析超时?或是 daemon 没复用?定位清楚再动手,比盲目堆参数有效得多。


















