想必大家在安卓開發(fā)過(guò)程中都會(huì)遇到同樣一個(gè)問(wèn)題,那就是項(xiàng)目編譯花費(fèi)的時(shí)間太久了,而浪費(fèi)了許多開發(fā)時(shí)間.本文整理了一些優(yōu)化AndroidStudio構(gòu)建速度的一些方案,希望能夠幫助到你.
一当悔、更新你的電腦配置
將你的CPU升級(jí)到頂配(I7 XXK),內(nèi)存32G赤屋,固態(tài)360G次询。
哈哈,開個(gè)玩笑夺饲。如果你是土豪胡陪,相信你也不會(huì)介意件舵,也會(huì)認(rèn)同我的。
二她倘、更新你的工具到最新版本
- 更新高版本穩(wěn)定的AndroidStudio版本和Gradle插件.谷歌之所以要更新版本,那一定是優(yōu)化了許多東西,在選擇的同時(shí)最好看下版本好,選擇正式穩(wěn)定版的工具.
- 在開發(fā)應(yīng)用程序時(shí)璧微,應(yīng)盡可能將其部署到運(yùn)行Android 7.0(API級(jí)別24)或更高級(jí)別的設(shè)備。較新版本的Android平臺(tái)實(shí)現(xiàn)更好的機(jī)制硬梁,將更新推送到你的應(yīng)用程序前硫,例如Android運(yùn)行時(shí)(ART)和本地支持多個(gè)DEX文件。
注意:在第一次完成構(gòu)建之后荧止,你可能會(huì)注意到后續(xù)的構(gòu)建(clean和incremental)執(zhí)行得更快(即使沒(méi)有使用此頁(yè)面上描述的任何優(yōu)化)屹电。這是因?yàn)镚radle守護(hù)進(jìn)程有一個(gè)性能提升的“熱身期”,類似于其他的JVM進(jìn)程罩息。
三嗤详、使用新的依賴和配置
新的配置 | 棄用配置 | 行為 |
---|---|---|
implementation | compile | 當(dāng)你的模塊配置一個(gè)implementation 依賴項(xiàng)時(shí)个扰,讓Gradle知道這個(gè)模塊在編譯的時(shí)候不需要把依賴項(xiàng)泄露給其他模塊瓷炮。也就是說(shuō),只有在運(yùn)行時(shí)递宅,依賴才可用于其他模塊娘香。使用這種依賴配置代替 api或compile可以導(dǎo)致顯著的構(gòu)建時(shí)間改進(jìn)苍狰,因?yàn)樗鼫p少了構(gòu)建系統(tǒng)需要重新編譯的項(xiàng)目的數(shù)量。例如烘绽,如果一個(gè) implementation依賴關(guān)系改變了它的API淋昭,Gradle只重新編譯這個(gè)依賴項(xiàng)以及直接依賴它的模塊。大多數(shù)應(yīng)用程序和測(cè)試模塊應(yīng)使用此配置安接。 |
api | compile | 當(dāng)一個(gè)模塊包含api依賴關(guān)系時(shí)翔忽,讓Gradle知道模塊想要將該依賴關(guān)系可傳遞地導(dǎo)出到其他模塊,以便在運(yùn)行時(shí)和編譯時(shí)使用它們盏檐。這個(gè)配置的行為就像compile(現(xiàn)在已經(jīng)被棄用了)歇式,你通常應(yīng)該只在庫(kù)模塊中使用它。這是因?yàn)楹埃绻鸻pi依賴項(xiàng)更改了外部API材失,Gradle會(huì)在編譯時(shí)重新編譯所有有權(quán)訪問(wèn)該依賴項(xiàng)的模塊。所以硫豆,擁有大量的api依賴會(huì)增加構(gòu)建時(shí)間龙巨。除非你想將一個(gè)依賴的API暴露給一個(gè)單獨(dú)的測(cè)試模塊,否則使用implementation 依賴熊响。 |
也就是說(shuō)在AndroidStudio3.0以后,能使用implementation的就使用implementation旨别,implementation可以提高編譯速度
四、開啟D8編譯
相比之前的DX編譯引擎汗茄,谷歌的下一代編譯引擎D8 dex編譯引擎不僅僅提高了編譯效率(體現(xiàn)在編譯時(shí)間減少上)昼榛,同時(shí)也減少了生成的.dex文件的大小。目前D8 dex編譯引擎已經(jīng)在android studio 3.0 里有剔难,而這一引擎將在android studio 3.1里成為默認(rèn)的引擎胆屿。可以在gradle.properties 文件里的android.enableD8設(shè)置成true即可使用D8 dex編譯引擎偶宫。
android.enableD8 = true
五非迹、將圖像轉(zhuǎn)換為WebP
WebP是一種圖像文件格式,提供有損壓縮(如JPEG)以及透明度(如PNG)纯趋,但可以提供比JPEG或PNG更好的壓縮憎兽。減少圖像文件的大小,而不必執(zhí)行構(gòu)建時(shí)壓縮吵冒,可以加快你的構(gòu)建纯命,特別是如果你的應(yīng)用程序使用大量的圖像資源。但是痹栖,解壓縮WebP映像時(shí)亿汞,你可能會(huì)注意到設(shè)備CPU使用率的小幅增加。使用Android Studio揪阿,你可以輕松地 將圖像轉(zhuǎn)換為WebP疗我。
六咆畏、禁用PNG運(yùn)算
如果你不能(或不想)將你的PNG圖像轉(zhuǎn)換為WebP,那么你仍然可以通過(guò)每次構(gòu)建應(yīng)用程序時(shí)禁用自動(dòng)圖像壓縮來(lái)加速構(gòu)建吴裤。如果你使用的是 Android插件3.0.0或更高版本旧找,則默認(rèn)情況下禁用Debug構(gòu)建類型的PNG運(yùn)算。要為其他構(gòu)建類型禁用此優(yōu)化麦牺,請(qǐng)將以下內(nèi)容添加到你的build.gradle文件中:
android {
buildTypes {
release {
// 為發(fā)布構(gòu)建類型禁用PNG運(yùn)算钮蛛。
crunchPngs false
}
}
// 如果你使用的是舊版本的插件,請(qǐng)使用以下內(nèi)容
// aaptOptions {
// cruncherEnabled false
// }
}
七剖膳、使用靜態(tài)依賴版本
在build.gradle文件中聲明依賴關(guān)系時(shí)愿卒,應(yīng)該避免在最后使用帶有加號(hào)的版本號(hào),例如 'com.android.tools.build:gradle:2.+'潮秘。使用動(dòng)態(tài)版本號(hào)可能會(huì)導(dǎo)致意外的版本更新琼开,難以解決版本差異以及Gradle檢查更新造成的較慢版本。你應(yīng)該使用靜態(tài)/硬編碼的版本號(hào)枕荞。
八柜候、啟用離線模式
如果你的網(wǎng)絡(luò)連接速度較慢,則當(dāng)Gradle嘗試使用網(wǎng)絡(luò)資源來(lái)解決依賴關(guān)系時(shí)躏精,你的構(gòu)建時(shí)間可能會(huì)受到影響渣刷。你可以通過(guò)只使用已緩存在本地的工件來(lái)告訴Gradle避免使用網(wǎng)絡(luò)資源。
在使用Android Studio構(gòu)建時(shí)要離線使用Gradle矗烛,請(qǐng)按照下列步驟操作:
- 通過(guò)單擊文File > Settings
- 在左側(cè)窗格中辅柴,單擊Build, Execution, Deployment > Gradle.
- 選中Offline work復(fù)選框瞭吃。
- 點(diǎn)擊Apply或者OK碌嘀。
九、配置守護(hù)進(jìn)程
- 單擊File > Settings.
- 在左側(cè)窗格中歪架,單擊Build, Execution, Deployment > Compiler.
- 選中Configure on demand復(fù)選框股冗。
- 點(diǎn)擊Apply或者OK。
十和蚪、啟用Instant Run
Instant Run通過(guò)推送某些代碼和資源更改而無(wú)需構(gòu)建新的APK止状,并且在某些情況下甚至不重新啟動(dòng)當(dāng)前活動(dòng),從而大大縮短了更新應(yīng)用程序所需的時(shí)間攒霹。
十一怯疤、自定義你的VM選項(xiàng)
要提高Studio的性能,最常見的選項(xiàng)是調(diào)整最大堆大小催束,但也可以使用該studio.vmoptions文件覆蓋其他默認(rèn)設(shè)置集峦,例如初始堆大小,緩存大小和Java垃圾收集開關(guān)。
要?jiǎng)?chuàng)建一個(gè)新studio.vmoptions文件或打開現(xiàn)有文件少梁,請(qǐng)使用以下步驟:
單擊Help > Edit Custom VM Options,如果你以前從未編輯過(guò)Android Studio的VM選項(xiàng),則IDE會(huì)提示你創(chuàng)建一個(gè)新 studio.vmoptions文件矫付。單擊是以創(chuàng)建該文件凯沪。
-
打開studio.vmoptions文件,編輯文件以添加你自己的自定義VM選項(xiàng)。有關(guān)可定制JVM選項(xiàng)的完整列表买优,請(qǐng)參閱Oracle的Java HotSpot VM選項(xiàng)頁(yè)面妨马。 下面是我自己的配置,僅供參考.
-Xms2048m -Xmx2048m -XX:MaxPermSize=2048m -XX:ReservedCodeCacheSize=1024m
十二、為開發(fā)創(chuàng)建一個(gè)構(gòu)建variant
在開發(fā)應(yīng)用程序 時(shí)杀赢,你準(zhǔn)備開發(fā)應(yīng)用程序所需的許多配置都不是必需的烘跺。啟用不必要的構(gòu)建過(guò)程會(huì)減慢增量構(gòu)建和清理構(gòu)建的速度,因此請(qǐng)配置構(gòu)建變體脂崔,以便在開發(fā)應(yīng)用程序時(shí)只保留構(gòu)建配置滤淳。下面的示例創(chuàng)建一個(gè)“dev”風(fēng)格和一個(gè)“prod”風(fēng)格(用于你的發(fā)行版本配置):
android {
...
defaultConfig {...}
buildTypes {...}
productFlavors {
//當(dāng)構(gòu)建一個(gè)使用這種風(fēng)格的variant時(shí),以下配置將覆蓋defaultConfig塊中的配置砌左。
dev {
//為了避免在從命令行構(gòu)建時(shí)使用傳統(tǒng)的multidex脖咐,將minSdkVersion設(shè)置為21或更高。
//當(dāng)使用Android Studio 2.3或更高版本時(shí)汇歹,構(gòu)建部署到運(yùn)行API級(jí)別21或更高級(jí)別
//的設(shè)備時(shí)屁擅,會(huì)自動(dòng)避免傳統(tǒng)的multidex,無(wú)論你設(shè)置為minSdkVersion产弹。
minSdkVersion 21
versionNameSuffix "-dev"
applicationIdSuffix '.dev'
}
prod {
// 如果你已經(jīng)為你的應(yīng)用程序的發(fā)布版本配置了defaultConfig塊派歌,你可以把這個(gè)塊留空,
// 而Gradle使用defaultConfig塊中的配置痰哨。你仍然需要?jiǎng)?chuàng)造這種flavor
// 否則胶果,所有variants 都使用“dev”flavor 配置。
}
}
}
如果你的構(gòu)建配置已經(jīng)使用product flavors 來(lái)創(chuàng)建應(yīng)用程序的不同版本斤斧,則可以使用flavors 將“dev”和“prod”配置與這些flavors相結(jié)合稽物。例如,如果你已經(jīng)配置了“demo”和“prod”的風(fēng)格折欠,則可以使用以下示例配置來(lái)創(chuàng)建組合flavors贝或,如“devDemo”和“prodFull”:
android {
...
defaultConfig {...}
buildTypes {...}
// 指定要使用的flavor dimensions。
// 按從高到低列出每個(gè)dimensions的優(yōu)先級(jí)
//當(dāng)Gradle合并variant的來(lái)源和配置锐秦。你必須將你配置的每個(gè)product flavors分配給其中一個(gè)flavor dimensions咪奖。
flavorDimensions "stage", "mode"
productFlavors {
dev {
dimension "stage"
minSdkVersion 21
versionNameSuffix "-dev"
applicationIdSuffix '.dev'
...
}
prod {
dimension "stage"
...
}
demo {
dimension "mode"
...
}
full {
dimension "mode"
...
}
}
}
避免編譯和打包未測(cè)試的資源(例如屏幕密度資源)。你可以通過(guò)只指定一個(gè)屏幕密度資源并屏蔽你的“dev” flavors來(lái)做到這一點(diǎn)酱床,如下面的例子所示:
android {
...
productFlavors {
dev {
...
// 下面的配置限制了“dev”風(fēng)格羊赵,以使用xxhdpi屏幕密度資源。
resConfigs "xxhdpi"
}
...
}
}
十三、Crashlytics報(bào)告設(shè)置
如果你不需要運(yùn)行Crashlytics報(bào)告昧捷,請(qǐng)通過(guò)禁用插件來(lái)加快你的調(diào)試版本闲昭,如下所示:
android {
...
buildTypes {
debug {
ext.enableCrashlytics = false
}
}
你還需要在運(yùn)行時(shí)禁用Crashlytics套件以進(jìn)行調(diào)試構(gòu)建,方法是更改??你在應(yīng)用程序中初始化Fabric支持的方式靡挥,如下所示:
// 初始化不使用調(diào)試構(gòu)建類型的構(gòu)建序矩。
Crashlytics crashlyticsKit = new Crashlytics.Builder()
.core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build())
.build();
Fabric.with(this, crashlyticsKit);
如果你想在調(diào)試版本中使用Crashlytics,那么你仍然可以通過(guò)防止Crashlytics在每次構(gòu)建期間使用自己的唯一構(gòu)建ID更新應(yīng)用程序資源來(lái)加速增量構(gòu)建跋破。要防止Crashlytics不斷更新其構(gòu)建ID簸淀,請(qǐng)將以下內(nèi)容添加到你的 build.gradle文件中:
android {
...
buildTypes {
debug {
ext.alwaysUpdateBuildId = false
}
}