本地構建的時候一次須要比較長的時間,存在優化空間。可使用 --profile
參數來分析構建過程當中各個任務的耗時狀況,好比 ./gradlew assembleDebug --profile
html
本文基於的硬件條件:java
./gradlew assembleDebug --profile
android
增量編譯:緩存
首次編譯(無緩存):微信
開發時的 Gradle 構建優化比較有意義,構建測試包、正式包的時候並不須要那麼關注構建時間。能夠將開發時的構建與提測構建分離,新建一個本地開發用的 productFlavor - local
,本地開發時只構建 local
包,在本地開發構建過程當中禁用掉沒必要要的任務(好比 lint, multidex, optimization 等),減小構建時間。jvm
https://developer.android.com/studio/build/multidex#multidexkeepproguardide
新建一個 local 的 productFlavor,設置 minSdkVersion 爲 21,這樣就會啓用 pre-dexing 構建功能(僅適用於 Android 5.0+),可以加快打包速度,改動以下:工具
/res/drawable
目錄下圖片的優化Android 構建工具默認會對 drawable 下的圖片進行優化,好比圖片壓縮轉換,校驗等,這個過程是比較耗時的,尤爲是當圖片比較多的時候。改動以下:post
android.dexOptions 的配置優化測試
一些比較老的文章還會推薦 dexOptions.incremental
,這是不必的,在 Gradle 2.1.0-rc1 (2016-04-22) 以後,incremental 增量構建已經默認啓用了,再也不須要顯式聲明。 此外,dexOptions.jumboMode
參數也是可選的,在啓用 instant-run 時這個參數會默認啓用
Gradle 在構建時都會去拉依賴,順序是:本地緩存 -> 遠程依賴。若是使用了動態版本,那麼每次 Gradle 都會拉最新的依賴,在依賴多的狀況下是很是耗時的,從下面這張圖能夠看出(挖財寶):
從上圖中能夠看出,光是拉依賴就用了 3 分鐘,這都還沒到編譯階段,難怪打個包要六七八分鐘。。。
在 Gradle 中,最好固定依賴的版本號,這樣就不會每次編譯都從新拉依賴,可是在目前快速迭代的背景下,通常都是鎖死第一位,第二位和第三位版本號自動更新,也無法鎖死依賴,只能把以前 resolutionStrategy 改一下,使用 Gradle 默認的動態版本號緩存策略(Gradle 的動態版本也會有緩存滴),改動以下:
改動以後的效果分析以下,拉依賴的時間從 3min 變成了 20s 左右,效果明顯。
可是這種狀況下,若是 snapshot 版本的依賴更新了,可能不會及時自動更新到本地(由於緩存),不過 Gradle 支持 --refresh-dependencies
參數,使用 ./gradlew assembleLocalDebug --refresh-dependencies
會全量刷新依賴。
Gradle 是基於 JVM 的構建系統,JVM 的啓動和初始化須要時間,開啓 Gradle Daemon 守護進程能夠節省這些時間
一次 Gradle 編譯大概由這幾部分組成:初始化、加載 setting.gradle(|| setting.gradle.kts)、加載各個模塊的 build.gradle(|| build.gradle.kts)、執行一系列任務。從上圖中能夠看到,Configuring Projects 也是花了 5s 左右的時間,使用 org.gradle.configureondemand=true
能夠加速這一過程。
啓用 Gradle 並行編譯,加速編譯過程
設置 Gradle 編譯時使用的最大內存,大一點比較好,可是個人小本本內存只有 8G,有心無力。。。 使用大內存時 Android 編譯過程當中的 dexing 就不會單獨開進程進行,能節省構建時間。
啓用 Android 編譯構建緩存,此舉能極大提高構建效率,推薦! 可是我司由於統跳編譯插件不支持編譯緩存,所以只能禁用。
綜上所述,挖財寶中啓用的開發時構建優化措施有:
/res/drawable
目錄下圖片的優化優化後使用 ./gradlew assembleLocalDebug
生成開發包,或者使用 ./gradlew installLocalDebug
直接安裝。 提測時使用 offcialDebug
或者 qqDebug
都可。打生產包時使用 offcialRelease
或者 qqRelease
。
優化以後的效果以下圖所示,增量編譯通常能夠控制在 2min 之內
增量編譯:
首次編譯(無緩存):
--profile
參數進行分析,分析報告在 build/reports/profile/
目錄下