文章大綱
由於種種原因在內地使用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倉庫鏡像庫使用。