如何加速緩慢的Gradle構(gòu)建

原文地址: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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,817評(píng)論 25 708
  • 太長(zhǎng)了,還是轉(zhuǎn)載吧...今天在看博客的時(shí)候,無(wú)意中發(fā)現(xiàn)了@Trinea在GitHub上的一個(gè)項(xiàng)目Android開(kāi)源...
    龐哈哈哈12138閱讀 20,256評(píng)論 3 283
  • 《麥肯錫方法》0721 想單初,我和大胖1號(hào)怎么狼狽為奸的場(chǎng)景,噢,不,是怎么相遇的場(chǎng)景 那是一個(gè)風(fēng)和日麗的下午,...
    周萍丶雷雨里的大少爺閱讀 318評(píng)論 19 14
  • 這不是一個(gè)熟悉的名字。但并不是因?yàn)樗莻€(gè)外國(guó)人,而是因?yàn)槲覀兺浟撕芏嗍虑椤T诎俣劝倏浦嘘P(guān)于他的故事有上萬(wàn)字。可以...
    保羅楊閱讀 1,182評(píng)論 0 1
  • 胸中有溝壑,腹內(nèi)隱雄兵。有句話(huà)說(shuō)戰(zhàn)爭(zhēng)是政治的延續(xù),那么戰(zhàn)爭(zhēng)背后的推手就是諸位謀士了。說(shuō)起謀主,魏國(guó)有荀攸,蜀國(guó)有法...
    秉筆春秋呂書(shū)生閱讀 762評(píng)論 10 16