Gradle加载失败、超时等问题的总结

一. 由来

现在不再是只做android开发,经常是干几天这个,干几天那个。切回android developer状态时,有时是维护旧项目,有时是开新项目。
而开新项目时,我比较头铁,经常跟着最新稳定版更新IDE、gradle、依赖库。
此时不可避免会产生同步问题:

gradle同步失败
gradle加载超时
依赖库解析失败
依赖库不匹配

以前都是按照记忆里的方法来解决,如果两次解决不了,就搜索引擎或者GPT。这样懒惰是不对的,不如查查资料总结一下,加深理解,归纳成文,用起来方便。

二. 问题描述

  • 相关加载超时、失败的提示如下(包含但不仅限于):
org.gradle.api.internal.artifacts.ivyservice.TypedResolveException: Could not resolve all dependencies for configuration 'incomingCatalogForLibs0'
Could not install Gradle distribution from 'https://services.gradle.org/distributions/gradle-8.9-bin.zip'.
Reason: java.net.SocketTimeoutException: Connect timed out

三. 问题分析和解决

  • gradle同步失败的原因主要为以下几点:

1. 网络连接问题

  • 原因:如果你的网络不稳定或者速度慢,可能会导致 Gradle 下载依赖项时超时。
  • 解决方法:
    确保你的网络连接稳定。
    如果你在中国,考虑使用国内的镜像源,如阿里云 Maven 镜像。
    增加 Gradle 的下载超时时间(在 gradle.properties 文件中设置)。

2. Gradle 版本或插件版本不兼容

  • 原因:使用的 Gradle 或 Android 插件版本与项目配置或其他库不兼容。
  • 解决方法:
    检查并更新 build.gradle 文件中的 Gradle 和插件版本到最新或兼容版本。
    确保所有依赖库版本一致且是最新的稳定版本。

3. 缓存问题

  • 原因:有时 Gradle 缓存可能会损坏,导致同步失败。
  • 解决方法:
    清除 Gradle 缓存。你可以通过 Android Studio 中的菜单 File -> Invalidate Caches / Restart… 来完成此操作。
    或者手动删除 .gradle 目录下的缓存文件。

4. 依赖冲突

  • 原因:不同模块或库之间的依赖冲突可能导致同步失败。
  • 解决方法:
    使用 ./gradlew app:dependencies 命令来检查项目的依赖树,找出潜在的冲突。
    解决依赖冲突,确保所有依赖都是兼容的。

5. 代理设置问题

  • 原因:如果你在公司网络环境下工作,可能需要通过代理访问互联网,如果代理设置不正确会导致同步失败。
  • 解决方法:不建议修改代理,因为当前的解决方法已经很完备,一般不需要修改代理,而能修改的前提是,你得有,一般开发者的单位没有代理。

6. 本地仓库配置错误

  • 原因:如果你配置了本地 Maven 或 JCenter 仓库,而这些仓库不可用或配置错误,也会导致同步失败。
  • 解决方法:
    检查并修正本地仓库路径和配置。
    确保你引用的仓库是可用的,并且可以正常访问。

7. Gradle Daemon 问题

  • 原因:有时候 Gradle Daemon 可能会因为某些原因挂起或无法正常工作。
  • 解决方法:
    尝试关闭所有的 Gradle Daemon 实例,可以通过命令行执行 ./gradlew --stop。

8. Android Studio 或 Gradle Bug

  • 原因:有时 Android Studio 或 Gradle 自身可能存在 bug。
  • 解决方法:使用最新的稳定版AndroidStudio和Gradle版本。(ps: 最好是切换回上个稳定版本)。

9. 防火墙或安全软件阻止

  • 原因:防火墙或安全软件可能会阻止 Gradle 访问网络资源。
  • 检查并调整防火墙或安全软件的设置,确保它们不会阻止 Gradle 的网络请求。

四. 解决方法归纳

上个章节是在GPT中查到的一些内容,现在将常见的提取一下:

  1. 网络问题导致的Gradle同步失败

网络不好导致的gradle同步失败,是构建新项目和新手常遇到的问题,这个主要是国内访问国外仓库的速度就像乌龟踱步,慢的可耻,速度慢就会导致连接超时,这是网络请求的基本常识吧,即使你能修改超时时间也是没用的,因为速度太慢了。还好国内有对应的镜像地址,修改下就好了。需要修改两个地址:

  • gradle-wrapper.properties 里的 distributionUrl

修改前:

#Tue Dec 03 18:35:47 CST 2024
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists  
#distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

修改后:

#Tue Dec 03 18:35:47 CST 2024
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists  
#distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.9-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

可以看到,上面的操作将
https://services.gradle.org/distributions/gradle-8.9-bin.zip
修改为了
https://services.gradle.org/distributions/gradle-8.9-bin.zip

这样以后就会下载这个这个地址的gradle-8.9-bin.zip了。
但是,这还存在一个问题,这个上面配置的 gradle-8.9-bin.zip 从哪下载呢?其实是在对应的gradle文件里配置的,我们也需要对它进行修改:

  • settings.gradle or settings.gradle.kts

修改前:

pluginManagement {
    repositories {
        google {
            content {
                includeGroupByRegex("com\\.android.*")
                includeGroupByRegex("com\\.google.*")
                includeGroupByRegex("androidx.*")
            }
        }
        mavenCentral()
        gradlePluginPortal()
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}

rootProject.name = "FirstDemo"
include(":app")

修改后

pluginManagement {
    repositories {
        google {
            content {
                includeGroupByRegex("com\\.android.*")
                includeGroupByRegex("com\\.google.*")
                includeGroupByRegex("androidx.*")
            }
        }
        maven { url = uri("https://maven.aliyun.com/repository/public") }
        maven { url = uri("https://maven.aliyun.com/repository/google") }
        mavenCentral()
        gradlePluginPortal()
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        maven { url = uri("https://maven.aliyun.com/repository/public") }
        maven { url = uri("https://maven.aliyun.com/repository/google") }
        google()
        mavenCentral()
    }
}

rootProject.name = "FirstDemo"
include(":app")

可以看到,上面的操作就是在repositories节点增加了两个地址,用于下载
这个的意思就是:从repositories节点下的地址去下载咱们在gradle-wrapper.properties里配置的 distributionUrl

需要注意的是:repositories 节点下新增的maven库地址,一般是国内的镜像地址,这个地址不是一成不变的,如果你修改的地址是阿里云的,请参考这里。比如当前日期(2024.12.04)的地址配置,如下图:

仓库名称阿里云仓库地址阿里云仓库地址(老版)源地址
centralhttps://maven.aliyun.com/repository/centralhttps://maven.aliyun.com/nexus/
content/repositories/central’
https://repo1.maven.org/maven2/
publichttps://maven.aliyun.com/repository/publichttps://maven.aliyun.com/nexus/
content/groups/public
central仓和jcenter仓的聚合仓
gradle-pluginhttps://maven.aliyun.com/repository/gradle-pluginhttps://maven.aliyun.com/nexus/
content/repositories/gradle-plugin
https://plugins.gradle.org/m2/
apache snapshotshttps://maven.aliyun.com/repository/apache-snapshotshttps://maven.aliyun.com/nexus/
content/repositories/apache-snapshots
https://repository.apache.org/
snapshots/

如果还是按照某些旧的帖子里记录的旧地址去配置,那样还是不会解决问题的。

  1. Gradle 版本或插件版本不兼容

这种情况主要是因为频繁更新版本和库导致的不匹配,请需要参考这里,及时做出相互匹配的修改,再进行同步。

  1. 其他的原因,请参照 三.问题分析和解决 这个章节里列举的其他条目,进行对应的操作就可以了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值