最近,我承擔了將 Kure 的 Android 代碼庫遷移到 AndroidX 的任務。這彷佛是嘗試和修復項目構建速度的絕佳機會。Gradle,因爲速度緩慢且資源密集,老是有一個糟糕的表明,但我很驚訝項目的構建配置的微小變化能夠大大提升構建速度。html
爲了讓你瞭解我從乾淨的構建中脫離的時間,這裏是構建掃描的先後指標。android
從5.5分鐘降低到17秒?太瘋狂了。bash
經過優化能夠輕鬆實現,便可進一步縮短構建時間。可是爲了保持這篇文章的初學友好,我將故意專一於爲接近這個指標而採起的輕微,無痛的措施。app
在開始優化以前,重要的是對咱們的項目進行基準測試,看看它目前須要多長時間才能構建。Gradle 有一個方便的掃描選項,你可使用它來分析任務的性能。在 Android Studio 上啓動終端並執行如下命令:jvm
./gradlew assembleDebug --scan
複製代碼
構建成功完成後,它將提示你接受服務條款以上載構建掃描結果。輸入 yes 繼續。完成發佈後,你將在終端上得到一個連接以檢查構建掃描。打開連接。工具
網站上有不少選項,但爲了簡潔起見,咱們只會看一下最重要的內容。post
摘要 視圖顯示已運行任務的摘要以及完成這些任務所需的時間。但咱們在這裏感興趣的是性能部分。它爲你提供了整體構建時間的更詳細分類,以下所示。性能
在性能部分下,有一個**「設置和建議」**選項卡,能夠爲你提供有關如何提升構建速度的建議。咱們來看看吧。測試
Android 團隊不斷改進和發展 Android 構建系統。所以,大多數狀況下,只需採用最新版本的工具便可得到重大改進。gradle
在這個重構時,咱們的項目是在 Android Studio 的 Gradle 插件版本3.2.1 (比最新版本早幾個版本)。
你能夠訪問此連接以獲取最新版本的 Gradle 插件的版本。
在撰寫本文時,最新版本剛好是版本3.4.0。
但它伴隨着咱們須要記住之後的問題:
developer.android.com/studio/rele…
使用 Gradle 5.0 及更高版本時,咱們須要顯式增長堆大小以確保咱們的構建速度不會惡化。咱們將在一分鐘內回到這一點。
打開你將在項目根目錄中找到的頂級 build.gradle 文件,並在 dependencies 部分中添加如下行:
classpath 'com.android.tools.build:gradle:3.4.0'
複製代碼
你還須要更新位於 gradle/wrapper/gradle-wrapper.properties 的 gradle 包裝器屬性文件中的分發 URL 。將 URL 更新爲如下內容。(此連接將在Android Gradle插件發佈頁面上提供。)
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
複製代碼
若是你在項目中使用 Kotlin,若是你的 Kotlin Gradle 插件的版本低於1.3.0,則會遇到錯誤。若是是這種狀況,請使用 IDE 的提示將你的 Kotlin Gradle 插件更新到最新版本(在撰寫本文時剛好是版本1.3.31)。
好吧,讓咱們再次從終端運行構建,看看咱們是否實現了任何改進。
因此咱們可以從構建時間開始大約2.5分鐘,但仍然不夠好。在調查終端中的構建日誌後,我遇到了一條咱們感興趣的行:
增量編譯基本上能夠防止浪費地編譯整個源文件集,而只編譯已更改的文件。查看日誌,很明顯咱們沒有利用此功能。它建議咱們使用 android.enableSeparateAnnotationProcessing = true,但因爲咱們在項目中使用 Kotlin,咱們不該該使用 'annotationProcessor' 配置。
幸運的是,Kotlin 版本1.3.30增長了對增量註釋處理的支持。
打開模塊級 build.gradle 文件,並將如下行添加到文件頂部:
apply plugin: 'kotlin-kapt'
複製代碼
接下來,更改依賴項部分中的全部 annotationProcessor 配置以使用 kapt。這是一個例子:
//Before
annotationProcessor 'com.google.dagger:dagger-compiler:2.9'
//After
kapt 'com.google.dagger:dagger-compiler:2.9'
複製代碼
如今打開位於項目根目錄的 gradle.properties 文件,並添加如下行:
kapt.incremental.apt=true
複製代碼
讓咱們再次運行構建。🤞🏼🤞🏼🤞🏼
咱們如今處於最後階段。還記得咱們在更新 Gradle 插件版本時遇到的問題嗎?結果是較新版本的 Gradle 將堆大小減少到512 MB。這是爲了確保低端機器不會窒息。我在16臺機器上,因此我能夠給 Gradle 守護進程提供2-3gig,但你的里程可能會有所不一樣。
打開位於項目根目錄的 gradle.properties 文件,而後添加如下行。請記住根據您的要求和機器規格選擇尺寸。
org.gradle.jvmargs=-Xmx3072m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
複製代碼
雖然咱們在這裏,但咱們還能夠在屬性中啓用並行構建和按需配置。
這是個人最終 gradle.properties 文件的樣子:
org.gradle.jvmargs=-Xmx3072m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
org.gradle.parallel=true
org.gradle.configureondemand=true
kapt.incremental.apt=true
複製代碼
有了這些,讓咱們看看咱們的構建速度指標:
這毫不是對能夠優化項目構建速度的全部方法的普遍報道。還有不少其餘的東西我沒有在這篇文章中討論,例如在使用 MultiDex 時使用 minSdk 21,預先解析你的庫,禁用 PNG 運算等等 - 僅舉幾例。
可是大多數這些配置都須要更深刻地瞭解Android的構建系統以及處理大型多模塊項目的經驗(這些項目的好處最明顯)。我上面提到的步驟很容易被一個項目歸入項目,即便是初級開發人員,也有很大的收益。我但願這能夠幫助你減小你的構建速度!
好吧,直到下一次,優秀!✌🏼