Android 進階——最大程度提升你的Android Studio 中Gradle編譯速度完全攻略


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章