distributionUrl必须改为file:///协议本地路径,如file:///C:/gradle/gradle-8.6-all.zip;离线需提前解压zip至GRADLE_USER_HOME/wrapper/dists/对应校验和目录;-all.zip提供源码与文档以支持IDE调试和断网查阅;org.gradle.offline=true仅禁用依赖下载,不影响Gradle分发下载。

gradle-wrapper.properties 里 distributionUrl 必须改成 file:// 协议
Wrapper 默认从 https://services.gradle.org/distributions/ 下载,断网时会卡在 “Downloading gradle-X.Y.Z-all.zip” 并报错。必须手动把 gradle-wrapper.properties 中的 distributionUrl 改成本地文件路径,格式严格为 file:///(三个斜杠),Windows 路径要转义反斜杠或用正斜杠。
常见错误写法:file://C:\gradle\gradle-8.6-all.zip(少一个斜杠)、file://D:/gradle/gradle-8.6-all.zip(两个斜杠,Linux/macOS 也不认)。
正确示例:
distributionUrl=file:///C:/gradle/gradle-8.6-all.zip distributionUrl=file:///Users/you/gradle/gradle-8.6-all.zip distributionUrl=file:///opt/gradle/gradle-8.6-all.zip
离线运行前必须确保 gradle-*.zip 已解压到 GRADLE_USER_HOME/wrapper/dists/
Wrapper 不是直接解压 zip 后就运行,它会先检查 GRADLE_USER_HOME/wrapper/dists/ 目录下是否存在对应版本的已解压目录。如果只放了 zip 文件但没解压,它仍会尝试下载——因为 Wrapper 的逻辑是:先找解压后的 gradle-8.6/ 目录,找不到才去拉 zip 并自动解压。
所以离线可用的最简路径是:
- 手动解压
gradle-8.6-all.zip到~/.gradle/wrapper/dists/gradle-8.6-all/xxxxx/(其中xxxxx是校验和子目录,可任意命名,但不能缺) - 或者直接把完整解压后的
gradle-8.6/目录整个放进该路径,保持结构为~/.gradle/wrapper/dists/gradle-8.6-all/xxxxx/gradle-8.6/ -
GRADLE_USER_HOME默认是~/.gradle,可通过gradle.properties或环境变量覆盖
all.zip 比 bin.zip 更适合离线,但不是因为“能跑起来”,而是因为 IDE 功能不掉链子
只跑 ./gradlew build 的话,-bin.zip 和 -all.zip 完全等效;但如果你在 Android Studio 或 IntelliJ 里点进 tasks.register、dependencies 等 DSL 方法,IDE 需要源码才能跳转。没有 -all.zip 里的 src/ 目录,IDE 只能显示反编译的桩代码,调试和排查构建脚本行为时非常吃力。
另外 docs/ 下的 User Guide 和 DSL Reference 在断网时就是唯一文档来源,bin 包里根本没有。
所以离线场景下选 -all.zip 的真实理由是:不是让它“能运行”,而是让它“能查、能读、能调”。
org.gradle.offline=true 只管依赖,不管 Gradle 自身分发
很多人以为加了 org.gradle.offline=true 就万事大吉,其实这个配置只影响依赖解析(即 ~/.gradle/caches/ 里的 jar/aar),对 Wrapper 下载 Gradle 二进制本身完全无效。即使开了 offline 模式,第一次运行 ./gradlew 时仍会尝试访问 distributionUrl。
换句话说:
-
org.gradle.offline=true→ 不连网下依赖 -
distributionUrl=file://...→ 不连网拿 Gradle 本体 - 两者必须同时配齐,才算真正离线
最容易被忽略的一点:gradle-wrapper.jar 本身不校验 zip 内容完整性,如果本地 zip 损坏或被截断,Wrapper 仍会静默解压并运行——然后在构建中途抛出奇怪的 NoClassDefFoundError 或 UnsupportedClassVersionError,此时得回头核对 SHA256。











