想必你們在安卓開發過程當中都會遇到一樣一個問題,那就是項目編譯花費的時間過久了,而浪費了許多開發時間.本文整理了一些優化AndroidStudio構建速度的一些方案,但願可以幫助到你.html
將你的CPU升級到頂配(I7 XXK),內存32G,固態360G。java
哈哈,開個玩笑。若是你是土豪,相信你也不會介意,也會認同個人。android
注意:在第一次完成構建以後,你可能會注意到後續的構建(clean和incremental)執行得更快(即便沒有使用此頁面上描述的任何優化)。這是由於Gradle守護進程有一個性能提高的「熱身期」,相似於其餘的JVM進程。api
新的配置 | 棄用配置 | 行爲 |
---|---|---|
implementation | compile | 當你的模塊配置一個implementation 依賴項時,讓Gradle知道這個模塊在編譯的時候不須要把依賴項泄露給其餘模塊。也就是說,只有在運行時,依賴纔可用於其餘模塊。使用這種依賴配置代替 api或compile能夠致使顯着的構建時間改進,由於它減小了構建系統須要從新編譯的項目的數量。例如,若是一個 implementation依賴關係改變了它的API,Gradle只從新編譯這個依賴項以及直接依賴它的模塊。大多數應用程序和測試模塊應使用此配置。 |
api | compile | 當一個模塊包含api依賴關係時,讓Gradle知道模塊想要將該依賴關係可傳遞地導出到其餘模塊,以便在運行時和編譯時使用它們。這個配置的行爲就像compile(如今已經被棄用了),你一般應該只在庫模塊中使用它。這是由於,若是api依賴項更改了外部API,Gradle會在編譯時從新編譯全部有權訪問該依賴項的模塊。因此,擁有大量的api依賴會增長構建時間。除非你想將一個依賴的API暴露給一個單獨的測試模塊,不然使用implementation 依賴。 |
也就是說在AndroidStudio3.0之後,能使用implementation的就使用implementation,implementation能夠提升編譯速度緩存
相比以前的DX編譯引擎,谷歌的下一代編譯引擎D8 dex編譯引擎不只僅提升了編譯效率(體如今編譯時間減小上),同時也減小了生成的.dex文件的大小。目前D8 dex編譯引擎已經在android studio 3.0 裏有,而這一引擎將在android studio 3.1裏成爲默認的引擎。能夠在gradle.properties 文件裏的android.enableD8設置成true便可使用D8 dex編譯引擎。bash
android.enableD8 = true複製代碼
WebP是一種圖像文件格式,提供有損壓縮(如JPEG)以及透明度(如PNG),但能夠提供比JPEG或PNG更好的壓縮。減小圖像文件的大小,而沒必要執行構建時壓縮,能夠加快你的構建,特別是若是你的應用程序使用大量的圖像資源。可是,解壓縮WebP映像時,你可能會注意到設備CPU使用率的小幅增長。使用Android Studio,你能夠輕鬆地 將圖像轉換爲WebP。網絡
若是你不能(或不想)將你的PNG圖像轉換爲WebP,那麼你仍然能夠經過每次構建應用程序時禁用自動圖像壓縮來加速構建。若是你使用的是 Android插件3.0.0或更高版本,則默認狀況下禁用Debug構建類型的PNG運算。要爲其餘構建類型禁用此優化,請將如下內容添加到你的build.gradle文件中:oracle
android {
buildTypes {
release {
// 爲發佈構建類型禁用PNG運算。
crunchPngs false
}
}
// 若是你使用的是舊版本的插件,請使用如下內容
// aaptOptions {
// cruncherEnabled false
// }
}複製代碼
在build.gradle文件中聲明依賴關係時,應該避免在最後使用帶有加號的版本號,例如 'com.android.tools.build:gradle:2.+'。使用動態版本號可能會致使意外的版本更新,難以解決版本差別以及Gradle檢查更新形成的較慢版本。你應該使用靜態/硬編碼的版本號。app
若是你的網絡鏈接速度較慢,則當Gradle嘗試使用網絡資源來解決依賴關係時,你的構建時間可能會受到影響。你能夠經過只使用已緩存在本地的工件來告訴Gradle避免使用網絡資源。jsp
在使用Android Studio構建時要離線使用Gradle,請按照下列步驟操做:
Instant Run經過推送某些代碼和資源更改而無需構建新的APK,而且在某些狀況下甚至不從新啓動當前活動,從而大大縮短了更新應用程序所需的時間。
要提升Studio的性能,最多見的選項是調整最大堆大小,但也可使用該studio.vmoptions文件覆蓋其餘默認設置,例如初始堆大小,緩存大小和Java垃圾收集開關。
要建立一個新studio.vmoptions文件或打開現有文件,請使用如下步驟:
打開studio.vmoptions文件,編輯文件以添加你本身的自定義VM選項。有關可定製JVM選項的完整列表,請參閱Oracle的Java HotSpot VM選項頁面。 下面是我本身的配置,僅供參考.
-Xms2048m
-Xmx2048m
-XX:MaxPermSize=2048m
-XX:ReservedCodeCacheSize=1024m複製代碼
在開發應用程序 時,你準備開發應用程序所需的許多配置都不是必需的。啓用沒必要要的構建過程會減慢增量構建和清理構建的速度,所以請配置構建變體,以便在開發應用程序時只保留構建配置。下面的示例建立一個「dev」風格和一個「prod」風格(用於你的發行版本配置):
android {
...
defaultConfig {...}
buildTypes {...}
productFlavors {
//當構建一個使用這種風格的variant時,如下配置將覆蓋defaultConfig塊中的配置。
dev {
//爲了不在從命令行構建時使用傳統的multidex,將minSdkVersion設置爲21或更高。
//當使用Android Studio 2.3或更高版本時,構建部署到運行API級別21或更高級別
//的設備時,會自動避免傳統的multidex,不管你設置爲minSdkVersion。
minSdkVersion 21
versionNameSuffix "-dev"
applicationIdSuffix '.dev'
}
prod {
// 若是你已經爲你的應用程序的發佈版本配置了defaultConfig塊,你能夠把這個塊留空,
// 而Gradle使用defaultConfig塊中的配置。你仍然須要創造這種flavor
// 不然,全部variants 都使用「dev」flavor 配置。
}
}
}複製代碼
若是你的構建配置已經使用product flavors 來建立應用程序的不一樣版本,則可使用flavors 將「dev」和「prod」配置與這些flavors相結合。例如,若是你已經配置了「demo」和「prod」的風格,則可使用如下示例配置來建立組合flavors,如「devDemo」和「prodFull」:
android {
...
defaultConfig {...}
buildTypes {...}
// 指定要使用的flavor dimensions。
// 按從高到低列出每一個dimensions的優先級
//當Gradle合併variant的來源和配置。你必須將你配置的每一個product flavors分配給其中一個flavor dimensions。
flavorDimensions "stage", "mode"
productFlavors {
dev {
dimension "stage"
minSdkVersion 21
versionNameSuffix "-dev"
applicationIdSuffix '.dev'
...
}
prod {
dimension "stage"
...
}
demo {
dimension "mode"
...
}
full {
dimension "mode"
...
}
}
}複製代碼
避免編譯和打包未測試的資源(例如屏幕密度資源)。你能夠經過只指定一個屏幕密度資源並屏蔽你的「dev」 flavors來作到這一點,以下面的例子所示:
android {
...
productFlavors {
dev {
...
// 下面的配置限制了「dev」風格,以使用xxhdpi屏幕密度資源。
resConfigs "xxhdpi"
}
...
}
}複製代碼
若是你不須要運行Crashlytics報告,請經過禁用插件來加快你的調試版本,以下所示:
android {
...
buildTypes {
debug {
ext.enableCrashlytics = false
}
}複製代碼
你還須要在運行時禁用Crashlytics套件以進行調試構建,方法是更改你在應用程序中初始化Fabric支持的方式,以下所示:
// 初始化不使用調試構建類型的構建。
Crashlytics crashlyticsKit = new Crashlytics.Builder()
.core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build())
.build();
Fabric.with(this, crashlyticsKit);複製代碼
若是你想在調試版本中使用Crashlytics,那麼你仍然能夠經過防止Crashlytics在每次構建期間使用本身的惟一構建ID更新應用程序資源來加速增量構建。要防止Crashlytics不斷更新其構建ID,請將如下內容添加到你的 build.gradle文件中:
android {
...
buildTypes {
debug {
ext.alwaysUpdateBuildId = false
}
}複製代碼