一、问题起因
通过Android studio新建了一个Android项目,同步gradle居然花费了30多分钟。忍不了,真的忍不了。
二、原因分析
1. 通过观察日志耗时情况
发现耗时主要集中在两方面:gradle下载和gradle依赖下载,如下图所示,gradle下载耗时24分钟,gradle依赖下载耗时7分钟

2. 查看gradle-wrapper.properties
文件路径gradle/wrapper/gradle-wrapper.properties
- gradle-wrapper.properties是Gradle Wrapper的配置文件,用于指定Gradle版本。通过配置这个文件,可以确保项目在不同的环境中使用相同版本的Gradle进行构建。
- Gradle Wrapper的目的是解决不同机器上Gradle版本不一致的问题,通过配置gradle-wrapper.properties文件,项目可以在任何环境下自动下载并使用正确的Gradle版本进行构建。
查看后发现,默认使用的地址为https://services.gradle.org/distributions/gradle-8.2-bin.zip。
| 12
 3
 4
 5
 
 | distributionBase=GRADLE_USER_HOMEdistributionPath=wrapper/dists
 distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
 
 | 
提示:可能你的gradle版本与我的不同,但并无影响
通过ip查询工具,可发现services.gradle.org域名所在地理位置为美国。呵呵!国外源,慢得理所应当。
3. 查看settings.gradle.kts
文件路径根目录
- settings.gradle.kts文件是Kotlin DSL格式的settings文件,它用于配置项目的模块结构。在这个文件中,你可以声明项目中包含哪些模块、这些模块之间的依赖关系,以及全局的构建逻辑。
- 在新版本gradle中,settings.gradle.kts文件还承担了仓库配置的工作,而这也是我们关注的重点
通过Android studio新建的项目,gradle仓库配置默认如下
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 
 | pluginManagement {repositories {
 google()
 mavenCentral()
 gradlePluginPortal()
 }
 }
 dependencyResolutionManagement {
 repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
 repositories {
 google()
 mavenCentral()
 }
 }
 
 rootProject.name = "My Application"
 include(":app")
 
 | 
通过ip查询工具,分别查询地理位置,默认源同样均在国外
行吧,国外源,网络情况不理想,下载速度相对较慢,慢得有理有据。
三、解决方式
对于上述问题,常见的解决方式无非走VPN代理或通过国内镜像源加速,由于合规的VPN代理需要申请,本文主要讲解通过国内镜像源加速的方式。有合规VPN代理的观众老爷们可以撤了。
1. gradle下载慢解决方案
常见的解决方案包括:使用gradle离线下载或通过gradle国内镜像源加速
个人觉得,gradle离线下载相对麻烦,不展开讲解。感兴趣的同学可自行百度gradle离线下载
对比gradle离线下载,通过gradle国内镜像源相对方便些,国内知名的gradle镜像源,包含阿里云和腾讯云
阿里云gradle镜像源:https://mirrors.aliyun.com/gradle
腾讯云gradle镜像源:https://mirrors.cloud.tencent.com/gradle/
可惜的是,阿里云gradle镜像源截至2019年就不再更新,gradle版本也停留在了gradle-5.6.2,若你使用的是gradle-5.6.2以上版本,更推荐你使用腾讯云gradle镜像源,使用方式如下:
替换https\://services.gradle.org/distributions为https\://mirrors.cloud.tencent.com/gradle
| 12
 3
 4
 5
 
 | distributionBase=GRADLE_USER_HOMEdistributionPath=wrapper/dists
 distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.2-bin.zip
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
 
 | 
2. gradle依赖下载慢解决方案
为加速gradle依赖下载,我们可以通过国内镜像源加速,这里强烈安利 阿里云镜像源
提示:上面仅列出我们使用到的镜像源,全量镜像源请见附录1:阿里云全量镜像源
使用方式如下:
修改settings.gradle.kts,将对应阿里云镜像仓库添加到google()和mavenCentral()上方,优先从国内源下载,如果没有再去原网站下。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 
 | pluginManagement {repositories {
 maven { url=uri ("https://www.jitpack.io")}
 maven { url=uri ("https://maven.aliyun.com/repository/releases")}
 maven { url=uri ("https://maven.aliyun.com/repository/google")}
 maven { url=uri ("https://maven.aliyun.com/repository/central")}
 maven { url=uri ("https://maven.aliyun.com/repository/gradle-plugin")}
 maven { url=uri ("https://maven.aliyun.com/repository/public")}
 google()
 mavenCentral()
 gradlePluginPortal()
 }
 }
 dependencyResolutionManagement {
 repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
 repositories {
 maven { url=uri ("https://www.jitpack.io")}
 maven { url=uri ("https://maven.aliyun.com/repository/releases")}
 maven { url=uri ("https://maven.aliyun.com/repository/google")}
 maven { url=uri ("https://maven.aliyun.com/repository/central")}
 maven { url=uri ("https://maven.aliyun.com/repository/gradle-plugin")}
 maven { url=uri ("https://maven.aliyun.com/repository/public")}
 google()
 mavenCentral()
 }
 }
 
 rootProject.name = "My Application"
 include(":app")
 
 
 | 
建议:请不要随意改变仓库位置。各个仓库的列出顺序决定了 Gradle 在这些仓库中搜索各个项目依赖项的顺序。例如,如果从仓库 A 和 B 均可获得某个依赖项,而您先列出了仓库 A,则 Gradle 会从仓库 A 下载该依赖项。
提示:若你使用的groovy,非kotlin,请转附录2:gradle依赖下载加速-groovy版
四、总结(省流版)
1. gradle下载慢解决方案
替换https\://services.gradle.org/distributions为https\://mirrors.cloud.tencent.com/gradle
| 12
 3
 4
 5
 
 | distributionBase=GRADLE_USER_HOMEdistributionPath=wrapper/dists
 distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.2-bin.zip
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
 
 | 
2. gradle依赖下载慢解决方案
修改settings.gradle.kts,将对应阿里云镜像仓库添加到google()和mavenCentral()上方,优先从国内源下载,如果没有再去原网站下。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 
 | pluginManagement {repositories {
 maven { url=uri ("https://www.jitpack.io")}
 maven { url=uri ("https://maven.aliyun.com/repository/releases")}
 maven { url=uri ("https://maven.aliyun.com/repository/google")}
 maven { url=uri ("https://maven.aliyun.com/repository/central")}
 maven { url=uri ("https://maven.aliyun.com/repository/gradle-plugin")}
 maven { url=uri ("https://maven.aliyun.com/repository/public")}
 google()
 mavenCentral()
 gradlePluginPortal()
 }
 }
 dependencyResolutionManagement {
 repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
 repositories {
 maven { url=uri ("https://www.jitpack.io")}
 maven { url=uri ("https://maven.aliyun.com/repository/releases")}
 maven { url=uri ("https://maven.aliyun.com/repository/google")}
 maven { url=uri ("https://maven.aliyun.com/repository/central")}
 maven { url=uri ("https://maven.aliyun.com/repository/gradle-plugin")}
 maven { url=uri ("https://maven.aliyun.com/repository/public")}
 google()
 mavenCentral()
 }
 }
 
 rootProject.name = "My Application"
 include(":app")
 
 
 | 
建议:请不要随意改变仓库位置。各个仓库的列出顺序决定了 Gradle 在这些仓库中搜索各个项目依赖项的顺序。例如,如果从仓库 A 和 B 均可获得某个依赖项,而您先列出了仓库 A,则 Gradle 会从仓库 A 下载该依赖项。
提示:若你使用的groovy,非kotlin,请转附录2:gradle依赖下载加速-groovy版
附录
附录1:阿里云全量镜像源
阿里云常见镜像库:https://developer.aliyun.com/mvn/guide
提示:由于阿里云官网更新,大家查到的数据可能比上面少。大部分库未在常见镜像库中展示,如google()库,全量仓库请通过https://developer.aliyun.com/mvn/view查看
附录2:gradle依赖下载加速-groovy版
修改settings.gradle,将对应阿里云镜像仓库添加到google()和mavenCentral()上方,优先从国内源下载,如果没有再去原网站下。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 
 | pluginManagement {repositories {
 maven { url=uri ("https://www.jitpack.io")}
 maven { url=uri ("https://maven.aliyun.com/repository/releases")}
 maven { url=uri ("https://maven.aliyun.com/repository/google")}
 maven { url=uri ("https://maven.aliyun.com/repository/central")}
 maven { url=uri ("https://maven.aliyun.com/repository/gradle-plugin")}
 maven { url=uri ("https://maven.aliyun.com/repository/public")}
 google()
 mavenCentral()
 gradlePluginPortal()
 }
 }
 dependencyResolutionManagement {
 repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
 repositories {
 maven { url=uri ("https://www.jitpack.io")}
 maven { url=uri ("https://maven.aliyun.com/repository/releases")}
 maven { url=uri ("https://maven.aliyun.com/repository/google")}
 maven { url=uri ("https://maven.aliyun.com/repository/central")}
 maven { url=uri ("https://maven.aliyun.com/repository/gradle-plugin")}
 maven { url=uri ("https://maven.aliyun.com/repository/public")}
 google()
 mavenCentral()
 }
 }
 
 rootProject.name = "My Application"
 include(":app")
 
 | 
建议:请不要随意改变仓库位置。各个仓库的列出顺序决定了 Gradle 在这些仓库中搜索各个项目依赖项的顺序。例如,如果从仓库 A 和 B 均可获得某个依赖项,而您先列出了仓库 A,则 Gradle 会从仓库 A 下载该依赖项。
参考文档
添加 build 依赖项 | Android Studio | Android Developers (google.cn)
阿里云仓库服务 (aliyun.com)
阿里巴巴开源镜像站
Android Studio 配置国内镜像源、HTTP代理