Gradle同步失败“Connection timed out”是代理未生效所致,因IDE启动JVM与Gradle子进程需双层代理配置,且需配合镜像源、TLS版本及DNS等协同调试。

Gradle同步失败:Connection timed out 是代理没生效
不是 Gradle 本身有问题,而是它根本没走你配的代理——默认情况下,gradle.properties 里的代理配置只对 Gradle 自身的 HTTP 请求生效(比如下载插件),但不自动透传给构建过程中调用的 javac、jar 或第三方工具链。更常见的是,IDE(如 Android Studio)启动时用的是自己的 JVM 参数,压根没加载你的 gradle.properties。
- 确认代理是否真被读取:在项目根目录下运行
./gradlew --version,再加-Djavax.net.debug=system看实际连接地址(注意输出里有没有CONNECT日志) -
gradle.properties必须放在用户主目录(~/.gradle/gradle.properties)才全局生效;放项目里只影响该工程,且某些 IDE 启动方式会跳过它 - 如果用公司内网代理,检查是否需额外配置
systemProp.https.nonProxyHosts,否则localhost、127.0.0.1可能被错误转发
Android Studio 中 Gradle 代理必须双层配置
IDE 启动 JVM 和 Gradle 子进程是两个独立环境,只配一个地方等于白配。尤其在 macOS 或 Windows 上通过桌面图标启动时,JVM 参数不会继承 shell 的环境变量。
- 第一层:IDE 自身网络 → Settings > Appearance & Behavior > System Settings > HTTP Proxy,选 Manual proxy configuration,填 host/port,并勾选
Proxy authentication(如有) - 第二层:Gradle 构建过程 → 打开
~/.gradle/gradle.properties,添加四行(缺一不可):systemProp.http.proxyHost=127.0.0.1<br>systemProp.http.proxyPort=7890<br>systemProp.https.proxyHost=127.0.0.1<br>systemProp.https.proxyPort=7890
- 改完后必须重启 Android Studio,且要清空
.gradle/caches/下的模块元数据(否则旧失败记录可能缓存并跳过重试)
Could not resolve org.jetbrains.kotlin:kotlin-stdlib-jdk8 类错误本质是仓库地址不可达
这个报错不是 Kotlin 版本冲突,而是 Gradle 根本连不上 mavenCentral() 或 google()。国内直连大概率超时,但很多人只改代理,忘了换仓库镜像——镜像源响应更快、更稳定,且不依赖本地代理稳定性。
- 在
settings.gradle(或settings.gradle.kts)里,把默认mavenCentral()替成清华源:maven { url "https://maven.tuna.tsinghua.edu.cn/repository/maven-central/" } - Android 项目还需显式替换
google():maven { url "https://maven.aliyun.com/repository/google" } - 不要同时保留原始仓库和镜像源(除非加
content { includeGroup "androidx.*" }做分组路由),否则 Gradle 会按顺序逐个尝试,第一个超时就卡住
代理配置后仍失败?检查 DNS 和 TLS 版本兼容性
有些代理工具(如 Clash、Surge)默认禁用 SNI 或强制降级 TLS,而 Gradle 7+ 默认要求 TLSv1.2+ 且校验 SNI,导致握手失败,错误表现为 Received fatal alert: protocol_version 或静默卡在 “Resolving dependencies…”。
- 临时验证是否 DNS 问题:在终端执行
curl -v https://repo.maven.apache.org,看是否能解析并建立连接 - 强制 Gradle 使用 TLSv1.2:在
gradle.properties加一行org.gradle.jvmargs=-Dhttps.protocols=TLSv1.2 - 如果代理是 mitm 类型(如 Fiddler、Charles),需手动将代理证书导入 JVM truststore,否则
PKIX path building failed错误无法绕过
代理这事,最麻烦的从来不是配哪几行,而是你永远不知道哪一层悄悄绕过了它——IDE 启动参数、Gradle 守护进程缓存、JVM 默认协议栈、甚至系统级 DNS 设置,都可能让那几行 systemProp 形同虚设。









