Gradle7.0版本及之后 AS2021.1.1 版本 的鏡像配置和打包APK問題匯總


為什么需要配置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即可 。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM