欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新

Gradle7.0版本及之后 AS2021.1.1 版本 的镜像配置和打包APK问题汇总,所以在这不说明jdk

来源: 开发者 投稿于  被查看 5935 次 评论:273

Gradle7.0版本及之后 AS2021.1.1 版本 的镜像配置和打包APK问题汇总,所以在这不说明jdk


为什么需要配置gradle?

本机环境:win10 + AS2021.1.1版本 

另外说明:搞android,jdk如果是8的,AS会根据你使用的AGP版本,提醒你升级到java11版本,会半自动往sdk文件夹下载11版本的jre。所以在这不说明jdk版本。

名词解释: AGP - Android Gradle 插件

最重要的环境就是AGP版本,官网版本说明中提到了版本变化,由早先1.0-4.~  ,直接跨越到了7.0

 

 

 

AS官网链接: https://developer.android.google.cn/studio/releases/gradle-plugin 

经过我千辛万苦的试错,终于透过了现象和语言障碍看到了本质(加载过程)

首先你的AS,创建新项目时,会根据你的AS版本找到对应的默认AGP版本,比如我的AS是2021.1.1,对应就是AGP7.1.1版本,而这个AGP版本就对应了Gradle7.2+的版本

 

 

 

 

 

 

而AS在构建项目时,会根据AS的settings,也就是IDE的设置进行查找:这里现放出默认配置。

 

 

 再来看项目里的properties文件是怎样进行默认配置的:

现放出AGP版本图:

 

对应文件

 

 

 

 

可以看到这几个加载项,顺序可变,一共五个,第一个找不到去第二个加载,以此类推,但一般情况下:如果你使用默认配置(没有配置自定义Gradle,和Gradle环境变量),那么我们自然就会跳转到url,也就是图中第二个加载项去下载整个gradle。

所以会很慢,但最慢的并不是下载gradle,而是加载常用的jar包依赖,比如junit,fastjson等等,会变得奇慢无比。 因为要去外网下载。

这时候也就是我们要配置gradle的原因了。

相信大家看到这里,也搜过类似的国内配置,但你能看到我这篇文章,说明你看的未能解决你的问题,或者令你一知半解。我教你,怎么在AS中正确配置自定义Gradle让其加载。

另外说一句,你想从Github上拉取Android项目,也需要修改各种Gradle配置,往下看,以后你不用在修改任何配置也能直接加载别人的项目

首先,去下载不低于你当前项目使用的AGP版本对应版本的Gradle,(这里直接百度Gradle即可,有官网,官网有版本可选择)。

为什么说不低于,是因为Gradle向下兼容,所以不必每次都对应上,直接下个最高的不好么、、、

下载完毕去配置一下国内镜像,这里我用的我贴一下。

allprojects{
    repositories {
        def ALIYUN_REPOSITORY_URL = 'https://maven.aliyun.com/repository/public/'
        def ALIYUN_JCENTER_URL = 'https://maven.aliyun.com/repository/jcenter/'
        def ALIYUN_GOOGLE_URL = 'https://maven.aliyun.com/repository/google/'
        def ALIYUN_GRADLE_PLUGIN_URL = 'https://maven.aliyun.com/repository/gradle-plugin/'
        all { ArtifactRepository repo ->
            if(repo instanceof MavenArtifactRepository){
                def url = repo.url.toString()
                if (url.startsWith('https://repo1.maven.org/maven2/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."
                    remove repo
                }
                if (url.startsWith('https://jcenter.bintray.com/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL."
                    remove repo
                }
                if (url.startsWith('https://dl.google.com/dl/android/maven2/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GOOGLE_URL."
                    remove repo
                }
                if (url.startsWith('https://plugins.gradle.org/m2/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GRADLE_PLUGIN_URL."
                    remove repo
                }
            }
        }
        maven { url ALIYUN_REPOSITORY_URL }
        maven { url ALIYUN_JCENTER_URL }
        maven { url ALIYUN_GOOGLE_URL }
        maven { url ALIYUN_GRADLE_PLUGIN_URL }
    }
 buildscript{
    repositories {
        def ALIYUN_REPOSITORY_URL = 'https://maven.aliyun.com/repository/public/'
        def ALIYUN_JCENTER_URL = 'https://maven.aliyun.com/repository/jcenter/'
        def ALIYUN_GOOGLE_URL = 'https://maven.aliyun.com/repository/google/'
        def ALIYUN_GRADLE_PLUGIN_URL = 'https://maven.aliyun.com/repository/gradle-plugin/'
        all { ArtifactRepository repo ->
            if(repo instanceof MavenArtifactRepository){
                def url = repo.url.toString()
                if (url.startsWith('https://repo1.maven.org/maven2/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."
                    remove repo
                }
                if (url.startsWith('https://jcenter.bintray.com/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL."
                    remove repo
                }
                if (url.startsWith('https://dl.google.com/dl/android/maven2/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GOOGLE_URL."
                    remove repo
                }
                if (url.startsWith('https://plugins.gradle.org/m2/')) {
                    project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GRADLE_PLUGIN_URL."
                    remove repo
                }
            }
        }
        maven { url ALIYUN_REPOSITORY_URL }
        maven { url ALIYUN_JCENTER_URL }
        maven { url ALIYUN_GOOGLE_URL }
        maven { url ALIYUN_GRADLE_PLUGIN_URL }
    }
}
}

创建一个init.gradle文件,内容为上述。放置到下载好的Gradle根目录下即可。

这里说明:你用你搜到的哪种写法的配置,哪个镜像都行,目的是让AS识别到镜像(AS构建项目时,会使用指定Gradle,去加载,如果你配置了镜像,它会识别到)

刷新同步时,可以看看

 

如图,有这个就可。

 下面重点来了

配置AS的Gradle目标目录:

 

2必须勾选,1随意,1用于别人可以用你Gradle,在混合开发中。一般没啥用。

2 为使用你配置里的配置项去下载依赖jar包。

3 则是最重要,使用你指定的位置的Gradle。

4则为 Gradle根目录,别忘了配置init.gradle

然后配置完ok,再次同步即可,你可以看到飞快的速度。

 

2022 . 4. 17日 更新

导入新项目时,如果你用上述方法出现奇怪的问题,   最好去官网查一下对应的AGP版本  然后直接下载gardle  , 重新设置对应版本自定义Gradle 即可

 

 

 

 

 

打包问题:

打包成apk时,可以试试.一个hello world的empty基本只需要不到20s

如果持续卡在某一步,好几十秒一分钟左右不变化.那么就可以试一下此解决方案:

打开app下的子模块的build.gradle配置文件

 

 

 

 

在此文件的

android {

}

配置

//    解决打包问题
lintOptions {
//不检查版本发布
checkReleaseBuilds false
//出现错误不终止
abortOnError false
}

重新打包APK即可 。

 

用户评论