Gradle 依赖反复下载?缓存回收与排查指南

1092 字
5 分钟
Gradle 依赖反复下载?缓存回收与排查指南

背景#

不少 Android / Java 开发者遇到过这个现象:一个 Gradle 项目,之前正常打开过、依赖都下载好了,过了一两周甚至一个月重新打开 Android Studio 或者执行 ./gradlew build,Gradle 又开始从头下载所有依赖了。

这不是错觉,也不是 Gradle 的 bug。背后有几层原因,下面逐个拆解。


原因一:Gradle 缓存 GC(最常见)#

Gradle 内置了缓存自动清理机制。默认每 7 天 检查一次,删除 24 小时内未被访问 的缓存条目。

也就是说,如果你两周没碰项目,Gradle Daemon 也没运行,那么整个 ~/.gradle/caches/modules-2/ 里的依赖 Jar 包都会被判定为”已过期”,在下次构建时被当作无效缓存清理掉。下次构建就只能全部重下。

检查方法#

Terminal window
cat ~/.gradle/caches/gc.properties

注意:gc.properties 只在 Gradle 执行过缓存 GC 后才会生成。如果你从未遇到过依赖重下的问题,这个文件可能根本不存在,这不代表 GC 没在工作——说明你的缓存一直在被活跃使用,从未触发过清理。

如果看到 last-gc-timestamp 在几天前,且你的项目在间隔期内没打开过,那就基本实锤了。

解决方案#

在项目或全局的 gradle.properties 中调整:

# 方案 A:完全禁用缓存 GC(推荐)
gradle.cache.cleanup.enabled=false
# 方案 B:延长保留天数
gradle.cache.cleanup.retain.unused.days=30

原因二:Gradle Wrapper 版本变化#

现在很多项目通过 Gradle Wrapper 锁版本。但如果:

  • 项目接入了 Renovate / Dependabot 自动更新 Wrapper 版本
  • 同事提交了升级 Wrapper 的 commit(./gradlew wrapper --gradle-version=8.x
  • 之前是 8.7,后来自动升级到了 8.9

那整个 Gradle 发行版都要重新下载,而且新版本 Gradle 的缓存路径不同,已有的 ~/.gradle/caches/ 对不上,就相当于所有依赖也要重新解析和下载。

检查方法#

Terminal window
cat gradle/wrapper/gradle-wrapper.properties

distributionUrl 是否和上次构建时一致。

解决方案#

如果是自动升级导致的,可以锁定 Wrapper 版本:

Terminal window
./gradlew wrapper --gradle-version=8.7

然后在项目中提交 gradle/wrapper/gradle-wrapper.properties 的变更即可。


原因三:~/.gradle 目录被系统清理#

Arch Linux(或者用 systemd-tmpfiles 的发行版)每天会按策略清理用户缓存目录。

检查自己的环境:

Terminal window
cat ~/.gradle/caches/gc.properties 2>/dev/null || echo "文件不存在(GC 未触发,但可以看 modules-2 体积判断)"
du -sh ~/.gradle/caches/modules-2/

如果 modules-2/ 的大小从几个 GB 变成了几十 MB,那肯定是被清理过了。

排查是否被 tmpfiles 清理:

Terminal window
grep -r "gradle" /usr/lib/tmpfiles.d/ /etc/tmpfiles.d/

如果确实有相关配置,可以在 ~/.config/systemd/user/tmpfiles.d/ 里覆盖。不过更多情况下这只是人为误操作(比如清理磁盘时删了 ~/.gradle)。


原因四:依赖元数据过期#

Gradle 在判断依赖是否需要重新下载时,会对比 Maven 仓库返回的 POM / module 文件的 Last-Modified 时间戳。如果远端仓库返回了比本地缓存更新的时间戳(即使内容没变),Gradle 也会认为缓存失效,触发重新下载。

这在用自建 Maven 仓库(如 Nexus、Artifactory)时比较常见,因为某些配置不当的代理仓库会对所有请求都返回最新的时间戳。

排查方法#

开启 Gradle 的 info 日志:

Terminal window
./gradlew build --info 2>&1 | grep -i "caching\|downloading\|expired"

如果看到大量 “Cached resource is expired” 的日志,说明是元数据过期问题。

解决方案#

  • 检查 Maven 仓库的缓存策略,确保 POM 的 Last-Modified 稳定
  • 或在 Gradle 中配置 cacheChangingModulesFor(0, 'seconds') 来控制动态模块的缓存时长

完整排查流程#

Terminal window
# 1. 确认缓存目录现状
du -sh ~/.gradle/caches/modules-2/
# 2. 查看 GC 日志(如果文件不存在说明 GC 从未触发过)
cat ~/.gradle/caches/gc.properties 2>/dev/null || echo "文件不存在,GC 尚未触发"
# 3. 检查 GRADLE_USER_HOME 是否被 IDE 改变
echo $GRADLE_USER_HOME
# 4. 看 Wrapper 版本有没有变过
git diff HEAD -- gradle/wrapper/gradle-wrapper.properties
# 5. 运行一次构建并查看缓存命中情况
./gradlew dependencies --console=verbose

总结#

原因概率一句话判断
缓存 GC★★★★★gc.properties 有近期清理记录
Wrapper 版本变了★★★★distributionUrl 变了
系统清缓存★★★~/.gradle 体积明显变小
元数据过期★★--info 日志显示大量 expired

大部分情况下,gradle.properties 加上 gradle.cache.cleanup.enabled=false 就能解决问题。如果不想全局关闭 GC,设置 gradle.cache.cleanup.retain.unused.days=30 给一个更长的保留窗口也是个折中的选择。

欢迎关注我的公众号

如果这篇文章对你有帮助,欢迎扫码关注公众号,后续会继续分享技术实践、踩坑记录和效率工具。

微信公众号二维码

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
Gradle 依赖反复下载?缓存回收与排查指南
https://suqishuo.cn/gradle-dependency-re-download-cache-gc/
作者
Ernest
发布于
2026-07-10
许可协议
CC BY-NC-SA 4.0
相关文章智能推荐
1
安卓开发相关框架文章收集(长期更新)
开发效率在做项目初期,如果知道有哪些框架/工具可用,对项目的开发会有很大的帮助。这篇帖子收集项目开发用过的,或者有类似需求不知道有对应工具,后来发现这些工具有相见恨晚感觉的。作为一个类似于备忘录的帖子,根据个人判断在需要的时候进行增删改查。介绍时候尽量用一两个关键词。收集的文章可能会因各
2
GitHub上star超过2k的安卓MVP架构指南
架构近日在搜MVP模式作为安卓项目架构时候,发现GitHub上一篇介绍MVP架构的文章。一看star已经超过2K了。通读全文发现作者用实际项目将MVP架构要怎么分职责讲得十分通俗易懂。为了方便大家查阅,把原文翻译了一下。作者还有一篇文章讲安卓项目和代码风格指南的。欢迎查看相关翻译。
3
GitHub上star超过2k的安卓项目和代码风格指南(绝对干货)
最佳实践近日在搜MVP模式作为安卓项目架构时候,发现GitHub上一篇介绍MVP架构的文章。一看star已经超过2K了。作者同项目的这篇文章讲安卓项目和代码风格指南,也非常有参考价值。为了方便大家查阅,把原文翻译了一下。点击查看作者介绍安卓MVP架构指南的翻译文章。
4
使用Github Actions 完成编译、发布release apk
构建使用Github Actions,我们可以编译,运行测试,还可以签署发布工件 。 但是,如果我们将密钥库上载到公共存储库,这很危险。作为开发人员,我们必须采取一些预防措施,例如不要提交API密钥或密钥库(使用Github Actions作为CI并不是这样做的借口。)
5
Android处理dicom文件记录
Android纯java编写,网上有搜到android版本的jar包,是dcm4che低版本,只在安卓平台上实现了reader,没实现writer。github上的版本有reader和writer实现,但是是依赖javax相关包的,安卓上没有这些包。所以用不了github上的版本。
随机文章随机推荐
Profile Image of the Author
Ernest
一个有理想的Android程序员
公告
欢迎关注我的公众号,第一时间获取技术文章与实践记录。
微信公众号二维码
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
分类
标签
站点统计
文章
29
分类
12
标签
53
总字数
126,599
运行时长
0
最后活动
0 天前
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.13.6
文章许可
CC BY-NC-SA 4.0

文章目录