原文地址:https://android.jlelse.eu/how-to-speed-up-your-slow-gradle-builds-5d9a9545f91a
Google I/O 2017已經(jīng)過(guò)去幾周了,相信大家都在觀看那些會(huì)議視頻,I/O中更加實(shí)際的Session之一是如何加快緩慢的Gradle構(gòu)建,谷歌工具團(tuán)隊(duì)提供了10個(gè)提高速度的提示,以加快你的gradle的構(gòu)建。
我決定將這些提示寫(xiě)成一個(gè)更方便的列表,所以這些提示不是我自己寫(xiě)的,是從Google的大會(huì)中摘取的記錄,所以這一切都要?dú)w功于谷歌團(tuán)隊(duì)。
使用最新的Android Gradle插件
工具團(tuán)隊(duì)不斷改進(jìn)Android Gradle插件,提高構(gòu)建速度,所以這個(gè)提示是非常簡(jiǎn)單的,始終使用最新版本。
buildscript{
repositories{
google()
}
dependencies{
classpath 'com.android.tools.build.gradle:3.0.0-alpha3'
}
}
避免傳統(tǒng)的multidex
如果你不懂multidex是什么,請(qǐng)閱讀本文,對(duì)于API 21及更高版本的設(shè)備上Native Multidex對(duì)性能影響很小,但舊的設(shè)備上的傳統(tǒng)的Multidex會(huì)受到影響,這就需要你將minSdkVersion設(shè)置為21,并開(kāi)發(fā)至少運(yùn)行在21及以上的應(yīng)用,如果你使用的是較新版本的Android Studio,將回你設(shè)置minSdkVersion,因此不需要我們做任何事情。
禁用多APK(在開(kāi)發(fā)中)
如果你在App中沒(méi)有使用ABI或密度分割,則可以跳過(guò)此提示,如果是這樣,你應(yīng)該禁用這個(gè)開(kāi)發(fā)版本,因?yàn)樗麜?huì)減慢構(gòu)建速度。
可以通過(guò)運(yùn)行開(kāi)發(fā)構(gòu)建時(shí)將變量傳遞給gradle來(lái)實(shí)現(xiàn),并在存在時(shí)禁止分割。
android{
if(project.hasProperty('devBuild')){
splits.abi.enable = false
splits.density.enable = false
}
}
當(dāng)使用命令行構(gòu)建時(shí):
./gradlew assembleDevelopmentDebug -PdevBuild
當(dāng)從Android Studio中build的話(huà):
添加 -PdevBuild 到命令行選項(xiàng)字段中,具體操作為Preferences -> Build,Execution ,Development -> Complier settings
最小化包含的資源
資源在APK中占用了大量的控件,并且打包所有的這些資源會(huì)減慢你的構(gòu)建速度,對(duì)于開(kāi)發(fā)構(gòu)建,你可以告訴Gradle僅對(duì)正在開(kāi)發(fā)的設(shè)備打包所關(guān)心的資源。
productFlavors{
development{
minSdkVersion 21
resConfigs("en","xxhdpi")
}
}
禁用PNG壓縮
在開(kāi)發(fā)構(gòu)建中默認(rèn)禁用PNG優(yōu)化,以加快您的構(gòu)建速度
android{
if(project.hasProperty('devBuild')){
aaptOptions.cruncherEnabled = false
}
}
使用即時(shí)運(yùn)行
即時(shí)運(yùn)行有一些不好的說(shuō)法,但是當(dāng)他運(yùn)行的時(shí)候,真的可以節(jié)省你很多的時(shí)間,在Android Studio 3.0中即時(shí)運(yùn)行有很多的改進(jìn),應(yīng)該會(huì)更加穩(wěn)定。所以值得一試
避免無(wú)意的更改
Gradle是超級(jí)靈活的,您可以在構(gòu)建腳本中做一些非常酷的事情,但是如果你不小心,可能就會(huì)減緩構(gòu)建速度,這個(gè)代碼片段將versionCode設(shè)置為當(dāng)前時(shí)間用于測(cè)試,單這意味著對(duì)于每個(gè)構(gòu)建,清單都會(huì)更改,從而導(dǎo)致不必要的處理和打包。
def buildDateTime = new Date().format('yyMMddHHmm').toInteger()
android{
defaultConfig{
versionCode buildDateTime
}
}
所以,在開(kāi)發(fā)構(gòu)建期間禁用這個(gè)
def buildDateTime = project.hasProperty('devBuild')?100:new
Date().format('yyMMddHHmm').toInteger()
android{
buildConfig{
versionCode buildDateTime
}
}
這里的經(jīng)驗(yàn)法則是確保任何自定義邏輯,插件或庫(kù)僅在必要的時(shí)候修改文件,而不是每次構(gòu)建都修改。
不要使用動(dòng)態(tài)依賴(lài)版本
使用動(dòng)態(tài)依賴(lài)版本不好的原因是他會(huì)創(chuàng)建不可重復(fù)的構(gòu)建,而且他將導(dǎo)致Gradle每24小時(shí)檢查依賴(lài)是否有新的版本,從而導(dǎo)致更長(zhǎng)的構(gòu)建時(shí)間。
所以始終使用特定的依賴(lài)版本
觀察內(nèi)存
注意分給Gradle的內(nèi)存量,你將會(huì)分給Gradle的內(nèi)存量
org.gradle.jvmargs=-Xmx1536m
自從Dex In Process發(fā)布依賴(lài),就不再需要舊的優(yōu)化
dexOptions{
javaMaxHeapSize = '4g'
}
使用Gradle緩存
Gradle緩存是Gradle3.5中新出的,使用Gradle緩存會(huì)緩存和重用之前構(gòu)建的輸出
這個(gè)再任何構(gòu)建,任何分支切換,真?zhèn)€項(xiàng)目中都可以使用。
Android Studio 3.0具有更多的優(yōu)勢(shì),因此請(qǐng)確保您啟用此緩存:
在gradle.properties中設(shè)置
org.gradle.caching=true