如何加快Gradle的構建速度

這裏寫圖片描述

Google I/O 2017已經過去幾周了,相信大家都參與了這次會議的許多專場。

本屆I/O的一個具有實際意義的話題是How to speed up your slow Gradle builds。在該專場會議上,Android Studio的工具團隊向大家推薦了10條非常有用的建議用來加快gradle的構建速度。

個人決定把這些建議整理成一個方便使用的列表,分享如下:

免責聲明:這些建議並非個人提出,而是整理自IO會議專題:How to speed up your slow Gradle builds,關於這些建議的解釋則是個人的措辭。

這一切要歸功於Google及其工具團隊。

Tip1-使用最新的Android Gradle插件

Android Studio的工具團隊經常更新Android Gradle插件來提升其構建速度,採納這一點也超級容易,使用最新的插件版本即可。

buildscript {
  repositories {
    google()
  }

 dependencies {
    classpath ‘com.android.tools.build.gradle:3.0.0-alpha3’
 }
}

Tip2-避免在minSdkVersion<21時使用Multidex

如果你還不清楚Multidex是什麼,那麼可以先讀一下這篇文章

原生的Multidex在API 21及其以上的設備上運行時對性能的影響非常小,但是使用Multidex + minSdkVersion<21(這裏譯者理解是使用分包兼容庫)的情況下則對性能則影響較大。

當開發一個App時,應當避免使用Multidex兼容包方式。

這就需要將App的minSdkVersion設置爲21並且設備至少爲API 21或以上。

好消息是如果使用的是新版本的Android Studio,它會幫開發者設置好minSdkVersion,所以開發者需要做的僅僅是點擊Run按鈕而已。

Tip3-禁用multi-APK(開發中)

如果App沒有使用多ABI或多密度支持,可以跳過這一條。

如果使用的話,在開發測試的構建過程中應當禁用它,因爲它延長了構建時間。

實現方式爲在Gradle中添加一個變量,在devBuild時,通過該變量來實現禁用:

android {
   if (project.hasProperty(‘devBuild’)){
      splits.abi.enable = false
      splits.density.enable = false
   }
}

當使用命令行方式構建:

./gradlew assembleDevelopmentDebug -PdevBuild

當使用Android Studio構建可做以下配置:

打開Preferences -> Build, Execution, Deployment -> Compiler,再Command-line選項後填寫-PdevBuild,如下圖所示:

這裏寫圖片描述

Tip4-減少包含的資源

資源佔據了APK大小的很大一部分,同時打包這些資源會降低構建速度。

對於開發構建,可以告訴Gradle僅僅打包關心的一部分資源,如僅針對開發測試設備分辨率的資源。

productFlavors {
  development {
    minSdkVersion 21
    //only package english translations, and xxhdpi resources   
    resConfigs (“en”, “xxhdpi”)
  }
}

Tip5-禁止PNG優化

PNG的優化默認是允許的,但是在開發測試構建時則是非必須的,因此可以禁止它來加速構建。

android {
  if (project.hasProperty(‘devBuild’)){
    aaptOptions.cruncherEnabled = false
  }
}

Tip6-使用Instant Run

Instant Run曾有一點不太好用,但它正常使用時真的可以節省很多時間。

Instant Run在Android Studio 3.0上做了很多改進,而且會更加穩定。

去試試!

Tip7-避免無意的修改

Gradle非常靈活,允許你在構建腳本里做一些非常酷的事情,但是一旦不小心則可能降低構建的速度。

下面這段腳本將versionCode設置爲當前時間——這對於測試非常有用,但這意味着每一次構建,配置都會變化從而引起不必要的處理操作。

//this is BAD!
def buildDateTime = new Date().format(‘yyMMddHHmm’).toInteger()
android {
  defaultConfig {
    versionCode buildDateTime
 }
}

一種好的做法是在開發測試時,禁用動態賦值:

def buildDateTime = project.hasProperty(‘devBuild’) ? 100 : new Date().format(‘yyMMddHHmm’).toInteger()
android {
  defaultConfig {
    versionCode buildDateTime
 }
}

我們應當確保自定義邏輯、插件以及庫文件僅在必要的時候才修改,而不是每一次構建時都要修改。

另一個常見的坑是Crashlytics的Build Id,Crashlytics每次構建時都會生成一個新的Id。

在debug構建過程中,這種行爲可以(而且應該)禁止,解決方法如下添加一行腳本:

apply plugin: ‘io.fabric’
android {
  buildTypes {
    debug {
      ext.alwaysUpdateBuildId = false
    }
  }
}

Tip8-不要使用動態依賴版本

不要使用動態依賴的原因如下:

  • 構建過程具有不確定性
  • Gradle會每24小時檢查一次新的依賴版本從而增加依賴解析時間

最好總是使用特定的依賴版本!

Tip9-注意內存

注意分配給Gradle的內存大小。

對於Gradle內存分配的設置以及Dex In Process的解釋,可以閱讀Reto Meier的這篇文章

一個給Gradle分配內存的示例如下:

org.gradle.jvmargs=-Xmx1536m

自從Dex In Process發佈,老的優化配置已不再需要:

dexOptions {
 javaMaxHeapSize = ‘4g’
}

Tip10-使用Gradle緩存

Gradle緩存是Gradle 3.5的新特性,當緩存開啓時,Gradle將緩存並重用之前構建的結果。

它適用於任何構建,任何分支更改,甚至是跨項目。

Android Studio 3.0使用了很多緩存功能,因此要保證緩存功能開啓:

# Set this in gradle.properties
org.gradle.caching=true

原文地址:How to speed up your slow Gradle builds

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