應用的構建速度會直接影響開發效率,本文將帶您經過改造一個 Android 應用: 「Google 追蹤聖誕老人 (Google Santa Tracker)」 來爲你們提供十個小技巧,幫助提高應用的 Gradle 構建速度,當咱們應用了全部的小技巧以後,該演示應用的構建速度快了三倍以上。
html
其次,在咱們開啓速度提高調優以前,來了解本次三個性能指標的說明:java
全量構建,也就是從新開始編譯整個工程的 debug 版;android
代碼增量構建,指的是咱們修改了工程的 Java / Kotlin 代碼;git
資源增量構建,指的是咱們對資源文件的修改,增長減小了圖片和字符串資源等。github
小技巧 1: 使用最新版本的 Android Gradle 插件緩存
![](http://static.javashuo.com/static/loading.gif)
每次 Android Gradle 插件的更新都會修復大量的 bug 及提高性能等新特性,所以保持最新的 Android Gradle 插件版本有很是大的必要。
微信
這是將 Android Gradle 插件版本從 2.x 更新到 3.0.0-alpha1 以後獲得的結果 (這裏的演示是基於 3.0.0-alpha1 版本,隨着插件版本的更新,性能的提高會更加明顯),咱們能夠看出,全量構建一次應用的時間直接減小了 25%,代碼改動的增量構建減小了將近 40%,資源改動的增量構建也減小了 16%。app
小技巧 2: 避免激活舊版的 Multidexide
![](http://static.javashuo.com/static/loading.gif)
-
啓用 multidex https://developer.android.google.cn/studio/build/multidex.html
小技巧 3: 禁用 Multiple APK 構建性能
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
禁用多 APK 構建不能僅僅在 splits 裏設置,由於這裏的設置對工程裏全部的構建變體都是可見的。正確的禁用多 APK 構建的方法是建立一個屬性來作判斷,這裏咱們設置了一個名爲 「devBuild」 的屬性,在構建的過程當中把這個值傳給 gradle,此時 gradle 會將 splits.abi.enable 和 splits.density.enable 設置爲 false,它就不會生成多個 APK 了。
Multiple APK
https://developer.android.google.cn/google/play/publishing/multiple-apks.html
構建變體
https://developer.android.google.cn/studio/build/build-variants.html
小技巧 4: 最小化使用資源文件
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
這裏咱們看到了較大程度上的改觀,全量構建的時間又下降了 6 秒,增量構建的時間也分別下降了 20% 以上。
小技巧 5: 禁用 PNG 壓縮
![](http://static.javashuo.com/static/loading.gif)
小技巧 6: 使用 Apply Changes
![](http://static.javashuo.com/static/loading.gif)
從 Android Studio 3.5 版開始 (3.5 版目前在 Beta 構建渠道發佈),開發者們可使用 Apply Changes 功能來提升構建性能,它可讓代碼和資源的改動直接生效而無需重啓應用,有時候甚至無需重啓當前的 Activity。與 Instant Run 的實現方式不同,Apply Changes 充分利用了 Android 8.0 以上版本操做系統的特性進行運行時檢測,從而動態的對類進行從新定義。所以,若是您但願使用 Apply Changes,則須要讓您的工程運行在 Android 8.0 (API級別26) 以上的真機或者模擬器上。
小技巧 7: 避免被動的改動
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
![](http://static.javashuo.com/static/loading.gif)
這個例子裏,咱們故意在構建腳本中加入裏一些搗亂的代碼以展示其帶來的損失。同時也舉一個在使用 Crashlytics 時的實際例子,這個插件默認會爲每次構建中都加入惟一 ID 做爲構建標識,這會帶來沒必要要的時間損失,您能夠經過在構建腳本里加入 ext.alwaysUpdateBuildId = false 來避免這個,固然也能夠選擇在開發階段徹底關閉 Crashlytics。
小技巧 8: 不使用動態版本標識
![](http://static.javashuo.com/static/loading.gif)
Gradle 提供了一個很是方便的依賴庫版本號管理功能,方便開發者們經過使用一個加號 「+」 標識但願使用這個依賴庫的最新版本。可是使用動態版本有幾個風險,從性能角度來講,Gradle 會每隔 24 小時去檢查一次依賴庫的更新,若是您的依賴庫不少,並且都使用了動態獲取最新版本的這個設定,那會對構建時候的性能產生必定的影響。
即便您不是特別在乎這些性能損耗,可是它仍然是有風險的——依賴庫的版本更新會讓您的構建充滿不肯定性,可能兩週以後您就在構建一個徹底不同的工程了,由於依賴庫代碼的更新對開發者們是不可見的。
小技巧 9: Gradle 內存分配調優
![](http://static.javashuo.com/static/loading.gif)
小技巧 10: 開啓 Gradle 構建緩存
![](http://static.javashuo.com/static/loading.gif)
-
關於 Gradle 構建緩存 https://docs.gradle.org/current/userguide/build_cache.html
總結
![](http://static.javashuo.com/static/loading.gif)
-
代碼倉庫 https://github.com/jmslau/santa-tracker-android -
官方文檔 https://developer.android.google.cn/studio/build/optimize-your-build
推薦閱讀
本文分享自微信公衆號 - Android羣英傳(android_heroes)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。