文章大纲
- 一、.gradle 、.gradle\caches及 .m2 目录
- 1 .gradle和.gradle\caches目录
- 1.1、解析xxx\gradle\wrapper\gradle-wrapper.properties文件下载Gradle
- 1.2、解析根Project和Module目录下build.gradle脚本加载第三方库
- 2、 .m2
- 二、Android Studio 使用Gradle 编译提升攻略
- 1、使用本地离线Gradle压缩包
- 2、利用本地搭建的maven 仓库
- 3、利用国内maven仓库镜像地址替代原始仓库
由于种种原因在内地使用jcenter、mavenCentral及google等远程仓库时(毕竟都是国外的服务器),Gradle Sync会很慢,google仓库甚至需要科学上网才能访问,这是造成Gradle 编译的速度缓慢的重要原因之一,当然如果CPU 不给力,编译的项目依赖库关系复杂也是原因之一。
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置。
一、.gradle 、.gradle\caches及 .m2 目录
默认情况Windows 下 .gradle 和 .m2 目录的路径存放在C:\Users\xxxx下,其中**.gradle 作为Gradle的Home 目录存放着所有使用Gradle下载的库文件和jar包**,而**.m2 目录则是存放着本地Maven仓库中下载的库文件**
1 .gradle和.gradle\caches目录
1.1、解析xxx\gradle\wrapper\gradle-wrapper.properties文件下载Gradle
这个properties文件里配置了Gradle :
- distributionBase——Gradle 的HOME目录
- distributionPath
- zipStoreBase——Gradle的缓存HOME目录
- zipStorePath ——Gradle 的缓存路径
- distributionUrl——指定Android Studio 加载Gradle 的源地址。
#Sun Apr 26 22:25:12 CST 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
Android Studio 编译时会自动解析xxx\gradle\wrapper\gradle-wrapper.properties文件,并从distributionUrl 节点中拿到Gradle 插件的Uri,如果配置的是http(s),则自动到对应的Uri中下载并缓存到本地的对应的 .gradle目录下,路径Uri里常见的形式有:
- https://services.gradle.org/distributions/gradle-5.1.1-all.zip 首次从网络链接去下载Gradle
- http://services.gradle.org/distributions/gradle-5.1.1-all.zip 首次从网络链接去下载Gradle
- file:/// D://Android//Gradle//gradle-5.1.1-all.zip 从本地对应路径下去获取Gradle
首次使用新版本的Gradle时,无论是本地解压还是网络下载成功之后,都会缓存到.gradle\wrapper\dists下,再次使用相同版本时就会直接先从.gradle\wrapper\dists去加载
注意:Gradle 自身的版本和Android Gradle Tools 插件的版本配对关系。
1.2、解析根Project和Module目录下build.gradle脚本加载第三方库
默认的根Project目录下的build.gradle,有两个作用:下载Google 开发的Android Gradle插件和指定Module加载第三库时查找的maven仓库。
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.0'
}
}
//配置给该Project下其他所有Module 引入依赖库时所用的源仓库
allprojects {
repositories {
google()
jcenter()
}
}
Android Studio 编译时自动解析build.gradle 构建脚本,首先解析Project 根目录下的build.gradle文件,首先是解析buildscript 节点,到repositories 配置的maven 仓库中对应的的路径(由dependencies 节点下的classpath属性)去下载对应的Android gradle插件和第三方的库,以上文件的含义是首先去google这个maven库下去加载“com.android.tools.build:gradle” 版本为3.4.0 的Android Gradle插件,如果google 仓库找不到则继续查找jcenter 仓库,找到则缓存到本地目录下;另外一个allprojects 节点则是对应Moudle目录下需要引入第三方库时候查找的maven库,加载完毕之后也会缓存到.gradle/caches对应目录下:
当你在**Module下的build.gradle脚本里
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:'+rootProject.ext.androidxAppcompat
implementation 'com.alibaba:fastjson:1.1.54.android'
}
引入第三库成功之后就会被缓存到xxx.gradle\caches\modules-2\files-2.1对应目录下:
另外引入成功之后也会在Android Studio 的项目下External Libraries显示。
2、 .m2
.m2 目录则是本地Maven仓库的目录,更多请参见开发 Gradle 插件系列文章。
二、Android Studio 使用Gradle 编译提升攻略
此处的措施不包含通过优化Android Studio 的配置参数进行优化。
1、使用本地离线Gradle压缩包
首先到 Gradle 官网下载对应版本的完整压缩包文件 ,
下载压缩包之后不需要解压直接存放到本地计算机的路径就好,比如存放到计算机下的D:\Android\Gradle\gradle-5.1.1-all.zip(Windows上的路径)配置时需要进行格式转换
...
distributionUrl=file:///D://Android//Gradle//gradle-5.1.1-all.zip
在最新版的Android Studio 3.6.x 时,在Gradle 栏目下有个Gradle 开关,切换为offline模式时,意味着所有库均使用本地缓存模式,若没有缓存会直接报错,而不是所谓的单纯设置Gradle的离线模式,第一次依赖时需要切换为在线模式,否则本地缓存没有,也不能去对应的地址下载,编译时找不到依赖库就会报错。
Android Studio 3.6 的Gradle 开关或许以上理解不够准确,但应该也不会差得太远,仅供参考。
2、利用本地搭建的maven 仓库
可以利用Nexus或者Artifactory 搭建自己的maven仓库,替代原始仓库jcenter()、mavenCentral()及google()等
Artifactory 的详细使用见下文。
buildscript {
repositories {
maven{
url 'http://localhost:8081/artifactory/list/android-basic-group/'
}
//如果你本地maven仓库 已经拥有了足够的库,那就不需要额外配置了,因为加载的顺序是从上到下的
google()
jcenter()
}
}
allprojects {
repositories {
maven{
url 'http://localhost:8081/artifactory/list/android-basic-group/'
}
google()
jcenter()
}
}
3、利用国内maven仓库镜像地址替代原始仓库
优先使用本地maven仓库,再使用 阿里云仓库服务 的代理镜像库作为下载源。
buildscript {
repositories {
maven{
// 替代 google()
url 'http://maven.aliyun.com/repository/google'
}
maven{
//替代 jcenter()
url 'http://maven.aliyun.com/repository/jcenter'
}
//替代public 库————jcenter和mavenCentral的聚合仓库
maven {url 'http://maven.aliyun.com/nexus/content/groups/public/'}
}
}
allprojects {
repositories {
maven{
url 'http://maven.aliyun.com/repository/google'
}
maven{
url 'http://maven.aliyun.com/repository/jcenter'
}
maven {url 'http://maven.aliyun.com/nexus/content/groups/public/'}
}
}
如果你的本地maven仓库里面保存的库资源不够充分,也可以混合maven仓库镜像库使用。