gradle-wrapper.properties 中设置超时无效,正确方式是在 gradle.properties 中配置 systemProp.org.gradle.internal.http.connectionTimeout、systemProp.org.gradle.internal.http.readTimeout 和 org.gradle.daemon.idletimeout 三个参数,同时需确保 JDK 版本匹配并使用可用的镜像源。

gradle-wrapper.properties 里不能设超时
很多人会下意识去改 gradle/wrapper/gradle-wrapper.properties 文件,加 timeout=60 或类似字段——这完全无效。这个文件只控制 distributionUrl 和本地缓存路径,不参与网络连接参数配置。Gradle Wrapper 启动时用的是 JVM 级别的 HTTP 客户端,超时由更上层的系统属性或 JVM 参数决定。
真正起作用的是 gradle.properties 的 systemProp 配置
超时必须通过项目根目录下的 gradle.properties 设置,且要用 systemProp. 前缀。关键项有三个,缺一不可:
-
systemProp.org.gradle.internal.http.connectionTimeout=60000:建连超时,单位毫秒(建议 60000~120000) -
systemProp.org.gradle.internal.http.readTimeout=60000:响应读取超时,同样建议拉长 -
org.gradle.daemon.idletimeout=600000:守护进程空闲超时,防止后台任务被误杀(注意:这不是下载超时,但影响整体稳定性)
这些值不是越大越好。设成 300000(5 分钟)可能掩盖真实网络问题,反而让失败延迟更久。国内常见波动下,60 秒通常已足够覆盖镜像站首包握手 + 下载完成。
Android Studio 里改 Gradle JDK 也可能间接影响超时
如果你在 File > Settings > Build > Build Tools > Gradle 中把 Gradle JDK 指向了较老的 JDK 8,而项目实际需要 JDK 17+,JVM 的 TLS 握手行为(比如不支持 ALPN)会导致 HTTPS 连接卡在 readTimeout 前就失败,此时调高 timeout 毫无意义。验证方式很简单:
- 打开终端,进项目根目录,执行
./gradlew --version - 观察输出中
JVM行是否匹配build.gradle里声明的compileSdk所需最低 JDK 版本 - 不匹配就换 JDK,别硬调 timeout
镜像源没配对,timeout 再大也没用
超时只是“等多久”,不是“怎么更快拿到”。如果你还用着默认的 https://services.gradle.org/distributions/gradle-8.7-bin.zip,哪怕设成 600 秒,大概率还是 Read timed out。必须同步做两件事:
- 修改
gradle/wrapper/gradle-wrapper.properties中的distributionUrl,例如换成腾讯云镜像:distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.7-bin.zip - 确认该镜像站确实提供你所需版本(有些镜像不同步最新版,比如 gradle-8.8 可能还没上清华源)
最常被忽略的一点:镜像 URL 必须和你本地 .gradle/wrapper/dists/ 下已存在的目录名严格对应。比如你手动下好了 gradle-8.7-bin.zip,但解压后目录名叫 gradle-8.7,而 wrapper 实际创建的是 gradle-8.7-bin(带 -bin 后缀),就会反复重试、假装没找到——这时候看日志里的 “Expected directory” 提示比调 timeout 有用得多。


















