彻底解决gradle与gradle plugin匹配关系以及gradle下载缓慢的问题

1. 问题引入

我们刚接触安卓开发,在环境搭建阶段,安装Android studio的时候或者新建一个项目的时候,往往会卡到一个地方一直等待,一直等待。。。直到最后报红线,怎么搞都不行。最后崩溃,放弃了,毁灭吧,搞不了了。

其实,就是一个gradle下载缓慢的小问题把好多新人挡在了Android开发的大门之外。

唉唉,朋友,别放弃,看这里,都是小问题。

这里给大家分享一下个人的解决方案。

2. 原因

原因可能有两个:

  1. gradle版本和gradle插件版本不匹配(这个会直接导致报错)
  2. 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地址。
默认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 离线模式

好了,这样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下载缓慢的问题时,可以参考上面给出的写法。希望对你有用!

您好!关于Gradle下载速度问题,可能有以下几个原因和解决方案: 1. 网络问题:首先,请确保您的网络连接稳定。可以尝试使用其他网络连接或者尝试在不同的时间段进行下载,以避免网络拥堵的情况。 2. Gradle版本问题:如果您正在下载的是较旧的Gradle版本,可能会导致下载速度较。建议使用最新版本的Gradle,您可以在Gradle官方网站(https://gradle.org/releases/)上找到最新的稳定版本。 3. 镜像源问题Gradle默认使用的是官方的下载镜像源,但某些地区的镜像源可能存在访问速度较问题。您可以尝试切换到其他镜像源来提高下载速度。在项目的根目录下的 `gradle.properties` 文件中添加以下内容: ```properties systemProp.http.proxyHost=your-proxy-host systemProp.http.proxyPort=your-proxy-port systemProp.https.proxyHost=your-proxy-host systemProp.https.proxyPort=your-proxy-port ``` 将 `your-proxy-host` 和 `your-proxy-port` 替换为可用的代理主机和端口。 4. 缓存问题Gradle会将下载的依赖项缓存在本地,下次下载时会先检查本地缓存是否存在,如果存在则直接使用缓存。如果您之前下载过相同版本的依赖项,Gradle会使用缓存,这可能会导致下载速度变。您可以尝试清理Gradle的缓存,然后再次进行下载。 在命令行中执行以下命令清理Gradle缓存: ```shell gradle clean ``` 或者,在Gradle用户目录下删除缓存文件夹(默认为 `~/.gradle/caches`),然后重新运行下载命令。 希望这些解决方案能帮助您加快Gradle下载速度!如果还有其他问题,请随时提问。
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子林Android

感谢老板,老板大气!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值