前言
作為一名 Android 開發同學,當你的工程和程式碼達到一定規模的時候,相信你一定遇到過編譯速度過慢的問題。比如:
等待編譯的時間,彷彿過了一個世紀,有沒有!
對於程式猿,時間尤其寶貴,當你修改完一個 BUG 或者想驗證一個功能時,卻因為編譯速度過慢而不得不打斷你的思路,也會嚴重影響你的開發效率。
正所謂,磨刀不誤砍柴工,所以,減少和提升你工程的編譯速度是一個值得立刻開始的重要工作。
如何優化
Gradle 官方的一些優化建議
- 儘可能的使用最新版本的 Gradle 和 JVM,這是最簡單直接的方式,Gradle 開發團隊會持續的更新 Gradle 版本,來優化構建速度以及提供一些新的特性,而使用新版本的 JVM,是因為 Gradle 執行在 JVM 上,所以,如果新版本的 JVM 提升了效能,同樣也會讓 Gradle 跑的更快。
-
Parallel execution,並行執行 Gradle 的 tasks,在你的
gradle.properties
檔案新增以下配置:org.gradle.parallel=true
-
Build Scan,是一個很好的診斷工具,通過該工具可以很好的幫助你去分析和解決編譯速度慢的問題。
使用方法:在你的 Gradle 構建工程裡執行以下命令
./gradlew build --scan
> 需要注意的是,Build Scan 是高版本的 Gradle(4.3+) 預設才有的功能,針對低版本(4.3以下)的 Gradle 需要額外安裝一個外掛才可以使用,具體資訊可以點選:[Build Scan Plugin User Manual
](https://docs.gradle.com/build-scan-plugin/?&_ga=2.100043736.79666310.1541473383-2130798346.1527486300#getting_set_up)
-
配置階段
- 減少不必要的
apply plugin
,按需使用。如果某個外掛不是所有的模組都要使用的情況下,就不要使用allprojects{}
的方式。 - 在配置階段避免執行一些耗時的工作,比如 IO 操作或者網路請求等
- 減少不必要的
-
依賴解析
- 減少動態 (2.+) 版本和 SNAPSHOT 版本的依賴庫,通常這種方式的依賴,會強制 Gradle 去遠端倉庫比對是否有新的變化。
- 避免不必要和未使用的依賴
-
任務執行階段
- 增量構建,詳細請點選:in the user guide.
-
Daemon
- 在老版本的 Gradle 開啟 Daemon 配置,而在 3.0 以後的 Gradle 版本是預設支援的。
-
調整 daemon’s 的堆大小,預設是 1 GB,如需調大,可在你的
gradle.properties
設定:org.gradle.jvmargs=-Xmx2048M
- 使用
implementation
替代compile
,有效的減少編譯時的依賴項,需升級至 Gradle 3.4 版本 -
增量編譯,Gradle 可以將依賴關係分析到單個類級別,以便僅重新編譯受更改影響的類。 增量編譯是 Gradle 4.10 以來的預設編譯。 在老的版本中,可以像這樣啟用它:
tasks.withType(JavaCompile) { options.incremental = true }
-
使用分析報告,通過以下命令可以在編譯完成後,生成一份本地的分析報告:
./gradlew assembleDebug --profile
Android 官方的一些優化建議
-
使用最新版本的工具
-
避免編譯不必要的資源,比如不必要的語言本地化,
你可以只指定一種語言資源和螢幕適配,如以下示例所示:
android {
...
productFlavors {
dev {
...
// The following configuration limits the "dev" flavor to using
// English stringresources and xxhdpi screen-density resources.
resConfigs "en", "xxhdpi"
}
...
}
}
-
開啟離線模式,
![](https://user-gold-cdn.xitu.io/2018/11/6/166e8123654236ee?w=1584&h=506&f=png&s=74335)
-
開啟按需配置
![](https://user-gold-cdn.xitu.io/2018/11/6/166e819b7cbbde69?w=1766&h=758&f=png&s=189902) > 注意一:如果你使用的是 Gradle 4.6 版本,而 `com.android.tools.build:gradle` 版本是 3.0.1 或者 3.1.0,你需要禁用該配置以避免一些不必要的問題,該問題會在將來的 Android Gradle 外掛版本中被修復 > 注意二:在最新的 Android Studio 版本中,configuration on demand 已被移除
- 使用 WebP 格式的圖片,有效減少影像檔案大小,而不必執行構建時壓縮,可以加快你的構建
-
關閉 PNG crunching,加快構建速度通過禁用自動影像壓縮,Gradle 3.0 版本以上在
debug
的構建型別下是預設關閉的。如需手動配置其他構建型別,如下示例:android { buildTypes { release { // Disables PNG crunching for the release build type. crunchPngs false } } // If you're using an older version of the plugin, use the // following: // aaptOptions { // cruncherEnabled false // } }
-
開啟 Instant Run
![](https://user-gold-cdn.xitu.io/2018/11/6/166e823fa2f75df0?w=1178&h=432&f=png&s=65707)
最後說幾句
其實,有些同學不太重視也不太願意花精力去折騰這些,想著忍忍也就過去了。但是,隨著編譯次數的增加,實際所浪費的時間遠超出你想象,而從提升團隊生產力的角度來看的話,這是一個投入產出比相當高的事情,以本人所參與的一個專案為例,優化後比優化前的構建時間減少了 50%,多出一個喝咖啡的時間還是很輕鬆的,而整個團隊節省下來的時間,可以 code review,可以去學習,可以早點下班,總之,都比你在邊等待構建邊發呆好!
參考文件
- Optimize your build speed
- Improving the Performance of Gradle Builds
- How to decrease your Gradle build time by 65%?
本文作者:yonglan.whl
本文為雲棲社群原創內容,未經允許不得轉載。