“No cached version available for offline mode”表明本地缓存缺失目标依赖的.jar、.pom或.module文件;需检查~/.gradle/caches/modules-2/files-2.1/及metadata-*目录,确认artifact是否存在且完整,并排查gradle.properties中org.gradle.offline=true强制配置。

离线构建报“缺少依赖”,不是 Gradle 没找对地方,而是它根本没缓存到那个依赖——No cached version available for offline mode 这句错误已经说得很直白:本地缓存里压根没有你要的 .jar、.pom 或 .module 文件。
确认本地缓存是否真有目标依赖
Gradle 离线模式只查 ~/.gradle/caches/modules-2/files-2.1/(Gradle 6+ 均适用),不走 Maven 本地仓库(~/.m2/repository)。别凭感觉猜,直接用路径验证:
- 运行
find ~/.gradle/caches/modules-2/files-2.1 -type d -name "guava"(把guava换成你报错里的 artifact 名) - 如果返回空,说明这个库从未被下载过;如果目录存在,再进子目录检查是否有
.jar和.pom文件 - 注意:Gradle 7+ 新增了
modules-2/metadata-*目录,若缺失该目录下的.module元数据文件,也会导致解析失败,即使.jar在
检查 gradle.properties 是否强制离线
IDEA 界面勾选“Offline work”只是其中一种触发方式,真正起决定作用的是配置文件。打开项目或用户级 gradle.properties,搜这行:
org.gradle.offline=true
只要它存在,无论 IDEA 是否勾选,Gradle 都会强制离线。删掉或注释掉这行,再试一次 ./gradlew build —— 如果这时能成功下载,就坐实是配置误启。
为什么 aapt2、AGP 插件类依赖特别容易缺
这类工具型依赖(如 com.android.tools.build:aapt2、com.android.tools.build:gradle)不走常规 implementation 流程,而是由 Android Gradle Plugin(AGP)在构建阶段动态解析并下载。它们的缓存位置和生命周期与普通依赖不同:
- AGP 8.0+ 的 aapt2 版本由插件自动推导,不会出现在
build.gradle的 dependencies 块里,所以--refresh-dependencies不会主动拉它 - 首次 sync 或 clean 后首次 build 才会触发下载,且缓存路径在
~/.gradle/caches/transforms-*/,不在modules-2下 - 解决办法:先联网执行一次完整 sync(Android Studio)或
./gradlew --no-daemon assembleDebug,确保 aapt2 和 transform 缓存落地
复制缓存目录后仍失败?路径和哈希校验是关键
把 ~/.gradle/caches 整个打包拷到另一台机器,常因两件事失效:
- Gradle 缓存文件名是内容 SHA1 值,不是原始文件名。若源机器用了不同 JDK 或 Gradle 版本生成缓存,哈希可能不一致,导致离线时无法匹配
- 缓存路径含绝对路径信息(尤其
transforms-*中的某些条目),换机器后路径变更会让 Gradle 认为“这不是我存的” - 稳妥做法:在目标机器上用相同 JDK + 相同 Gradle Wrapper + 相同 AGP 版本,先联网跑一次
./gradlew dependencies --scan,再立刻切--offline
离线构建真正的难点不在“怎么关网络”,而在于“怎么让 Gradle 相信它已经见过所有东西”。缓存是否完整、元数据是否匹配、路径是否可迁移——这三个点漏掉任何一个,--offline 就只是个报错开关。











