文章目录
一. 由来
现在不再是只做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中查到的一些内容,现在将常见的提取一下:
网络不好导致的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)的地址配置,如下图:
仓库名称 | 阿里云仓库地址 | 阿里云仓库地址(老版) | 源地址 |
---|---|---|---|
central | https://maven.aliyun.com/repository/central | https://maven.aliyun.com/nexus/ content/repositories/central’ | https://repo1.maven.org/maven2/ |
public | https://maven.aliyun.com/repository/public | https://maven.aliyun.com/nexus/ content/groups/public | central仓和jcenter仓的聚合仓 |
gradle-plugin | https://maven.aliyun.com/repository/gradle-plugin | https://maven.aliyun.com/nexus/ content/repositories/gradle-plugin | https://plugins.gradle.org/m2/ |
apache snapshots | https://maven.aliyun.com/repository/apache-snapshots | https://maven.aliyun.com/nexus/ content/repositories/apache-snapshots | https://repository.apache.org/ snapshots/ |
如果还是按照某些旧的帖子里记录的旧地址去配置,那样还是不会解决问题的。
这种情况主要是因为频繁更新版本和库导致的不匹配,请需要参考这里,及时做出相互匹配的修改,再进行同步。
- 其他的原因,请参照 三.问题分析和解决 这个章节里列举的其他条目,进行对应的操作就可以了。