解決gradle與gradle plugin匹配關系以及gradle下載緩慢的問題
1. 問題引入
我們剛接觸安卓開發,在環境搭建階段,安裝Android studio的時候或者新建一個項目的時候,往往會卡到一個地方一直等待,一直等待。。。直到最后報紅線,怎么搞都不行。最后崩潰,放棄了,毀滅吧,搞不了了。
其實,就是一個gradle下載緩慢的小問題把好多新人擋在了Android開發的大門之外。
唉唉,朋友,別放棄,看這里,都是小問題。
這里給大家分享一下個人的解決方案。
2. 原因
原因可能有兩個:
- gradle版本和gradle插件版本不匹配(這個會直接導致報錯)
- gradle服務器在國外,國內網絡訪問自然慢啊,Android Studio已經盡力了。
3. 解決方法
3.1 檢查gradle版本和gradle插件版本是否匹配
- gradle版本的定義在你的
gradle-wrapper.properties
如:
distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip
上述文件中的 distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip 表明,你使用的gradle 版本是 6.5,具體的包是gradle-6.5-bin.zip
- gradle插件版本的定義在你的
build.gradle(project級別)文件里。
如:
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath "com.android.tools.build:gradle:4.1.0"
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
上述文件中的 classpath "com.android.tools.build:gradle:4.1.0" 表明,你的gradle plugin(插件)版本是 4.1.0
那么, 6.5 版本的 gradle 和 4.1.0 版本的gradle plugin匹配嗎?怎么號不太一樣?
答案是匹配的!這兩個的匹配關系有個表格,官方地址是:gradle與gradle plugin匹配關系。
當前已有的關系如下表:

所以,這下知道了吧。好多工程編譯出錯都可能是這兩個版本號的關系沒匹配造成的。
3.2 解決gradle下載慢的問題
3.2.1 手動下載gradle包
既然Android studio下載不下來,那么我們可以手動下載啊。這里是gradle的官方下載地址:https://services.gradle.org/distributions/
點進去,下載對應的版本就行了。如果還下載不下來,試試國內的gradle鏡像地址:https://mirrors.cloud.tencent.com/gradle/
舉個例子:
如我們需要gradle-6.5.all.zip這個包,下載好之后,需要把它放到你電腦的C:\Users\fxjzz\.gradle\wrapper\dists\gradle-6.5-all\2oz4ud9k3tuxjg84bbf55q0tn
這個目錄下,不用解壓,在打開工程后android studio會自動幫我們解壓。
注意
- 上述路徑的
fxjzz是我電腦的用戶名,你的電腦是對應自己的用戶名。- 如果你的
dists下沒有對應的gradle版本文件夾,你需要打開你的Android studio項目,它會開始sync,也就是下載需要的gradle,這時候就會自動在你的dists目錄下創建gradle-6.5-all文件夾,以及后面的一串亂七八糟字母的子文件夾2oz4ud9k3tuxjg84bbf55q0tn,這個名字是隨機生成的,你的肯定和我這個不一樣。
3.2.2 替換gradle地址源為國內鏡像地址
上節提到,國內的gradle鏡像地址:https://mirrors.cloud.tencent.com/gradle/,而Android工程默認的gradle地址是國外的:https://services.gradle.org/distributions/,見下圖gradle-wrapper.properties文件里的配置:distributionUrl:https\://services.gradle.org/distributions/gradle-8.4-bin.zip,其中,https\://services.gradle.org/distributions 對應的就是 國外的gradle地址。

因此,我們只需要把它替換為國內的即可。注意url的寫法,替換后應該是https\://mirrors.cloud.tencent.com/gradle/gradle-8.4-bin.zip
注意:我這里是舉例 grale-8.4.bin,你的工程替換為自己的 gradle-xxx.zip 即可
解決了gradle下載的問題后就萬事大吉了嗎?
可能還不夠。。。因為除了 gradle,工程還會依賴一下其他的庫,而這些庫的地址也是來自國外倉庫,也有下載失敗的可能。
這種情況只是可能,有的人可能不會遇到,很順利的一會兒就成功了。對于遇到問題的情況,我們繼續下面的操作。
3.2.3 替換相關依賴庫的倉庫地址為國內地址
既然還是由于依賴庫地址位于國外,我們下載受限,那么還是一樣的辦法:替換為國內倉庫地址。
這里也有兩種方法,推薦就用方法一吧。
3.2.3.1 方法一:在build.gradle(project級別)里改變依賴倉庫(推薦)
國內倉庫地址說明:阿里云maven倉庫
build.gradle文件(groovy語言版本)↓
buildscript {
repositories {
maven {url 'https://maven.aliyun.com/repository/public'}
maven {url 'https://maven.aliyun.com/repository/central'}
maven {url 'https://maven.aliyun.com/repository/jcenter'}
maven {url 'https://maven.aliyun.com/repository/google'}
maven {url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}
maven {url 'https://maven.aliyun.com/nexus/content/repositories/releases'}
maven {url 'https://maven.aliyun.com/repository/apache-snapshots'}
maven {url 'https://jitpack.io'} // 為github的依賴提供
}
// google()
// jcenter()
dependencies {
classpath "com.android.tools.build:gradle:4.0.0"
}
}
allprojects {
repositories {
maven {url 'https://maven.aliyun.com/repository/public'}
maven {url 'https://maven.aliyun.com/repository/central'}
maven {url 'https://maven.aliyun.com/repository/jcenter'}
maven {url 'https://maven.aliyun.com/repository/google'}
maven {url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'}
maven {url 'https://maven.aliyun.com/nexus/content/repositories/releases'}
maven {url 'https://maven.aliyun.com/repository/apache-snapshots'}
maven {url 'https://jitpack.io'} // 為github的依賴提供
// google()
// jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
即,用國內的代理倉庫地址取代google和jcenter這兩個倉庫地址。當然這兩個保留也沒事,這些倉庫地址可以多寫,它會從能獲取到的地址去獲取。
3.2.3.2 方法二:配置全局替換的文件 (影響比較大,不推薦了)
在.gradle文件夾下添加倉庫替代的配置文件init.gradle,這樣可以為所有工程自動替換倉庫。不需要每新建一個工程都修改里面的build.gradle文件了。
創建一個init.gradle文件,內容如下:
gradle.projectsLoaded {
rootProject.allprojects {
buildscript {
repositories {
def JCENTER_URL = 'https://maven.aliyun.com/repository/jcenter'
def GOOGLE_URL = 'https://maven.aliyun.com/repository/google'
def NEXUS_URL = 'http://maven.aliyun.com/nexus/content/repositories/jcenter'
all { ArtifactRepository repo ->
if (repo instanceof MavenArtifactRepository) {
def url = repo.url.toString()
if (url.startsWith('https://jcenter.bintray.com/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $JCENTER_URL."
println("buildscript ${repo.url} replaced by $JCENTER_URL.")
remove repo
}
else if (url.startsWith('https://dl.google.com/dl/android/maven2/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $GOOGLE_URL."
println("buildscript ${repo.url} replaced by $GOOGLE_URL.")
remove repo
}
else if (url.startsWith('https://repo1.maven.org/maven2')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL."
println("buildscript ${repo.url} replaced by $REPOSITORY_URL.")
remove repo
}
}
}
jcenter {
url JCENTER_URL
}
google {
url GOOGLE_URL
}
maven {
url NEXUS_URL
}
}
}
repositories {
def JCENTER_URL = 'https://maven.aliyun.com/repository/jcenter'
def GOOGLE_URL = 'https://maven.aliyun.com/repository/google'
def NEXUS_URL = 'http://maven.aliyun.com/nexus/content/repositories/jcenter'
all { ArtifactRepository repo ->
if (repo instanceof MavenArtifactRepository) {
def url = repo.url.toString()
if (url.startsWith('https://jcenter.bintray.com/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $JCENTER_URL."
println("buildscript ${repo.url} replaced by $JCENTER_URL.")
remove repo
}
else if (url.startsWith('https://dl.google.com/dl/android/maven2/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $GOOGLE_URL."
println("buildscript ${repo.url} replaced by $GOOGLE_URL.")
remove repo
}
else if (url.startsWith('https://repo1.maven.org/maven2')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL."
println("buildscript ${repo.url} replaced by $REPOSITORY_URL.")
remove repo
}
}
}
jcenter {
url JCENTER_URL
}
google {
url GOOGLE_URL
}
maven {
url NEXUS_URL
}
}
}
}
把這個文件放到C:\Users\fxjzz\.gradle這個目錄下。這里 fxjzz 是我的用戶名,你自己的電腦會有自己的用戶名。
3.2.4 設置gradle 離線模式
一般來說,經過上面的操作,不會再有問題了。這小節也是參考閱讀一下吧。
如果還是不行的話,試試打開 gradle 的離線模式吧。gradle 默認是在線模式,也就是缺什么包,它自己在線下載什么包。雖然我們上面已經手動下載好了 gradle 包,并放到了上述的目錄下,但傻傻的 android studio 還是走自己在線下載 gradle 的路子,不撞南墻不回頭啊。
因此,我們可能還需要再幫它一把,告訴它,走離線模式吧,我已經幫你下載好了 gradle 了。
如下圖所示,點擊箭頭所指圖標即可打開 “gradle 離線模式”,再次點擊就是關閉。 打開后,重新 sync 即可靜待奇跡發生。

好了,這樣gradle下載緩慢的問題,應該能徹底的被解決啦~
再也不用氣到崩潰啦~
4. settings.gradle.kts 中如何設置gradle
時隔幾年,Android gradle的發展日新月異。目前(2024.12.8),AndroidStudio已經全面支持kotlin語言,連build.gradle文件也默認推薦使用kotlin語言,取代舊的groovy語言了,出現了新的gradle文件:build.gradle.kts、settings.gradle.kts,并且關于倉庫地址的定義也被挪到了 settings.gralde.kts中(也許未來位置還會變更,但不影響本文對其寫法的示范)。
因此,在settings.gradle.kts文件中如何設置國內倉庫代理呢?下面對本文章的更新將為大家示范。
4.1 groovy版的build.gradle文件
作為對比,首先看下舊的 groovy 語言的gradle文件里,關于倉庫地址是如何寫的:
repositories {
maven {url 'https://maven.aliyun.com/repository/public/'}
mavenCentral()
}
4.2 kotlin版的settings.gradle.kts文件
kotlin版的倉庫地址定義,寫法符合kotlin語法,出現了setUrl()這樣的方法調用,如下:
repositories {
maven {
setUrl("https://maven.aliyun.com/repository/public/")
}
mavenCentral()
}
下面給出一個完整的 settings.gradle.kts的示例吧:
pluginManagement {
repositories {
maven {
setUrl("https://maven.aliyun.com/repository/public")
}
maven {
setUrl("https://maven.aliyun.com/repository/google")
}
maven {
setUrl("https://maven.aliyun.com/repository/jcenter")
}
maven {
setUrl("https://maven.aliyun.com/nexus/content/repositories/releases")
}
maven {
setUrl("https://jitpack.io")
}
google {
content {
includeGroupByRegex("com\\.android.*")
includeGroupByRegex("com\\.google.*")
includeGroupByRegex("androidx.*")
}
}
mavenCentral()
gradlePluginPortal()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.PREFER_PROJECT)
repositories {
maven {
setUrl("https://maven.aliyun.com/repository/public")
}
maven {
setUrl("https://maven.aliyun.com/repository/google")
}
maven {
setUrl("https://maven.aliyun.com/repository/jcenter")
}
maven {
setUrl("https://maven.aliyun.com/nexus/content/repositories/releases")
}
maven {
setUrl("https://jitpack.io")
}
google()
mavenCentral()
}
}
rootProject.name = "ViewModelTest"
include(":app")
總之,如果你的工程和AndroidStudio已經升級到了比較新的版本,出現了settings.gradle.kts文件,那么在配置國內代理解決gradle下載緩慢的問題時,可以參考上面給出的寫法。希望對你有用!
轉載:https://blog.csdn.net/fxjzzyo/article/details/113776278

浙公網安備 33010602011771號