背景
因使用Jenkins自动构建Android工程,且Jenkins服务器无法翻墙的情况下,处理gradle换源问题。但网上大都是复制转载,故将解决方案记录。
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
换源后大部分依赖库下载速度加快,但仍出现部分依赖仍然很慢。原因是gradle源的引用规则是自上而下顺序查找对应的源地址中是否有对应的依赖库包及版本,如下面代码我们只是增加阿里云的源地址,最后依赖可以下载成功,但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系统组件构建时用到的依赖库源,比如什么插件地址这种都放这里;allprojects{repositories}
是指项目构建所需要的以来包地址。区分一下放置不同的源,也可以加快编译效率。当然也像下面用例偷懒可以写成一样,不影响实际效果。
将阿里云的源放前面,优先查找,如找到对应依赖后则切换下一个依赖,不会执行后面的源查找了。阿里云里都没有再到jcenter、maven中央库和google里查找。
当然除了阿里云效仓库的源,也有其他国内源自行查找最新的,不不过最好上官网查询最新地址,网上2020前文章中的大部分地址都已过期失效。
/**
* Tips: gradle源引用规则是自上而下顺序,在某库中找到源则不再遍历其他库。
*/
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仓库,将所有项目中用到的第三方依赖都备份到私服中,只需要优先引用私服的源地址即可。这种方式能彻底解决问题且有利于代码及工程管理,但较耗时。