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