為什麼需要配置gradle? 本機環境:win10 + AS2021.1.1版本 另外說明:搞android,jdk如果是8的,AS會根據你使用的AGP版本,提醒你升級到java11版本,會半自動往sdk文件夾下載11版本的jre。所以在這不說明jdk版本。 名詞解釋: AGP - Android ...
為什麼需要配置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,再次同步即可,你可以看到飛快的速度。
打包問題:
打包成apk時,可以試試.一個hello world的empty基本只需要不到20s
如果持續卡在某一步,好幾十秒一分鐘左右不變化.那麼就可以試一下此解決方案:
打開app下的子模塊的build.gradle配置文件
在此文件的
android {
}
中
配置
// 解決打包問題
lintOptions {
//不檢查版本發佈
checkReleaseBuilds false
//出現錯誤不終止
abortOnError false
}
重新打包APK即可 。