背景
因使用Jenkins自動構建Android工程,且Jenkins服務器無法翻墻的情況下,處理gradle換源問題。但網(wǎng)上大都是復制轉載,故將解決方案記錄。
gradle構建引用原理是從build.gradle文件中的倉庫源URL中查詢檢索對應的依賴包及版本,下載慢或鏈接不上主要是墻的原因導致無法訪問對應的國外倉庫源地址,如google,jcenter。
- 情景A
國內Android Studio在使用Gradle構建時因被墻的原因,導致每次編譯下載依賴資源過慢以及構建打包都會花費很多時間或報錯,我的筆記本完整重新構建需要幾十分鐘影響效率。
如[Fatal Error] cas-server-support-mongo.pom 6.3.0 文檔中根元素前面的標記必須格式正確或類似錯誤, 是因為在源中找不到對應地址,返回了404或其他html頁面,被gradle下載下來當成pom解析,所以報錯。
所以簡單處理就是翻墻就ok,但遇到我上述中使用Jenkins或類似無法翻墻的情況,就采用更換國內鏡像源地址的方式。 - 情景B
換源后大部分依賴庫下載速度加快,但仍出現(xiàn)部分依賴仍然很慢。原因是gradle源的引用規(guī)則是自上而下順序查找對應的源地址中是否有對應的依賴庫包及版本,如下面代碼我們只是增加阿里云的源地址,最后依賴可以下載成功,但gradle會從google()、jcenter()順序往下搜索查詢,再加上墻的原因就更慢了。所以需要調整源地址順序,參考文末的方式。
buildscript {
ext.kotlin_version = '1.3.20'
repositories {
google()
jcenter()
jcenter(){ url 'https://jcenter.bintray.com/'}
maven { url 'https://jitpack.io' }
maven { url 'http://maven.aliyun.com/'}
maven { url "https://maven.aliyun.com/repository/central" }
maven { url "https://maven.aliyun.com/repository/public" }
maven { url "https://maven.aliyun.com/repository/google" }
maven { url "https://maven.aliyun.com/repository/gradle-plugin" }
}
解決方案
build.gradle文件目錄如下,其中第一個部分buildscript{repositories}是指gradle系統(tǒng)組件構建時用到的依賴庫源,比如什么插件地址這種都放這里;allprojects{repositories}是指項目構建所需要的以來包地址。區(qū)分一下放置不同的源,也可以加快編譯效率。當然也像下面用例偷懶可以寫成一樣,不影響實際效果。
將阿里云的源放前面,優(yōu)先查找,如找到對應依賴后則切換下一個依賴,不會執(zhí)行后面的源查找了。阿里云里都沒有再到jcenter、maven中央庫和google里查找。
當然除了阿里云效倉庫的源,也有其他國內源自行查找最新的,不不過最好上官網(wǎng)查詢最新地址,網(wǎng)上2020前文章中的大部分地址都已過期失效。
/**
* Tips: gradle源引用規(guī)則是自上而下順序,在某庫中找到源則不再遍歷其他庫。
*/
buildscript {
ext.kotlin_version = '1.3.20'
repositories {
maven { url "https://maven.aliyun.com/repository/central" }
maven { url "https://maven.aliyun.com/repository/public" }
maven { url "https://maven.aliyun.com/repository/google" }
maven { url "https://maven.aliyun.com/repository/gradle-plugin" }
maven { url 'https://jitpack.io' }
mavenCentral()
jcenter()
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.6.3'
//dagger2
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
allprojects {
repositories {
maven { url "https://maven.aliyun.com/repository/central" }
maven { url "https://maven.aliyun.com/repository/public" }
maven { url "https://maven.aliyun.com/repository/google" }
maven { url "https://maven.aliyun.com/repository/gradle-plugin" }
maven { url 'https://dl.google.com/dl/android/maven2/' }
maven { url 'https://jitpack.io' }
mavenCentral()
jcenter()
google()
}
}
其他解決方案
- 將難以下載的依賴從官方找aar或jar包,或gradle本地已下載緩存中獲取包,進行本地引用
- 搭建私服maven倉庫,將所有項目中用到的第三方依賴都備份到私服中,只需要優(yōu)先引用私服的源地址即可。這種方式能徹底解決問題且有利于代碼及工程管理,但較耗時。