当前位置:   article > 正文

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

gradle下载慢

问题引入

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

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

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

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

原因

原因可能有两个:

  1. gradle版本和gradle插件版本不匹配(这个会直接导致报错)
  2. gradle服务器在国外,国内网络访问自然慢啊,Android Studio已经尽力了。

解决方法

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
  • 1
  • 2
  • 3
  • 4
  • 5

上述文件中的 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
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

上述文件中的 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匹配关系

当前已有的关系如下表:
在这里插入图片描述

所以,这下知道了吧。好多工程编译出错都可能是这两个版本号的关系没匹配造成的。

2. 解决gradle下载慢的问题

手动下载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,这个名字是随机生成的,你的肯定和我这个不一样。

这样手动下载了就好了吗?

可能还不够。。。

当我们手动下载,并且放置到对应位置,重新打开工程,可能会发现下面的进度仍然显示在下载某些东西。瓦特?这是搞什么?!!

没错,它还要下一些东西。这时候如果你的网络下不下来,依然会非常慢,甚至报错。

上述情况只是可能,有的人可能不会遇到,很顺利的一会儿就成功了。

对于上述情况,
在手动下了gradle后,我们再增加一道措施:替换依赖仓库为国内的仓库地址

替换依赖仓库为国内地址

这里也有两种方法。

方法一:在build.gradle(project级别)里改变依赖仓库
buildscript {
    repositories {
//        google()
//        jcenter()
        maven {url 'https://maven.aliyun.com/repository/jcenter'}
        maven {url 'https://maven.aliyun.com/repository/google'}
        maven {url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
    }
    dependencies {
        classpath "com.android.tools.build:gradle:4.0.0"
    }
}

allprojects {
    repositories {
//        google()
//        jcenter()
        maven {url 'https://maven.aliyun.com/repository/jcenter'}
        maven {url 'https://maven.aliyun.com/repository/google'}
        maven {url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

即,用国内的代理仓库地址取代google和jcenter这两个仓库地址。

方法二:配置全局替换的文件(推荐)

在.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
            }
        }
    }
}
  • 1
  • 2
  • 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
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74

把这个文件放到C:\Users\fxjzz\.gradle这个目录下。这里 fxjzz 是我的用户名,你自己的电脑会有自己的用户名。

设置gradle 离线模式

如果还是不行的话,试试打开 gradle 的离线模式吧。gradle 默认是在线模式,也就是缺什么包,它自己在线下载什么包。虽然我们上面已经手动下载好了 gradle 包,并放到了上述的目录下,但傻傻的 android studio 还是走自己在线下载 gradle 的路子,不撞南墙不回头啊。
因此,我们可能还需要再帮它一把,告诉它,走离线模式吧,我已经帮你下载好了 gradle 了。
如下图所示,点击箭头所指图标即可打开 “gradle 离线模式”,再次点击就是关闭。 打开后,重新 sync 即可静待奇迹发生。
打开 gradle 离线模式

好了,这样gradle下载缓慢的问题,应该能彻底的被解决啦~
再也不用气到崩溃啦~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/449032
推荐阅读
相关标签
  

闽ICP备14008679号