【譯】我每週在構建Gradle時是如何節約出5小時的

PhilCoulson發表於2017-12-16

原文連結

Gradle是一個基於JVM可以用於構建Android工程的編譯工具。它和Ant以及Maven類似,但是比他們更優秀。隨著Android專案變得越來越複雜,模組化地開發也越來越流行,所以構建的效率效能變得至關重要。每次構建專案中節省幾秒,這對於整個專案和工作來說有極大的效率提升。

你們可能已經意識到,即使是最簡單的Gradle呼叫也比較慢。在我的Mac上,大約需要6秒鐘來簡單地列出專案的可用gradlew。

下面是一些能夠提升Gradle執行效率的提示:

Gradle Daemon(Gradle守護程式)

你可以減少Gradle的啟動時間(在我的電腦上下降到2秒鐘),下面是使用守護程式來構建專案:

org.gradle.daemon=true

##Parallel Project Execution(並行專案執行) 如果你正在構建一個具有很多Module並且依賴比較關係比較複雜的專案,那麼這個改動能對你產生比較重要的影響:

org.gradle.parallel=true

Configure projects on demand(根據需求配置專案)

Gradle在執行任務之前會配置每個專案,並且不管這個專案是否需要特定的構建。"Configure projects on demand"模式可以改變這種方式,只配置所需要的專案。像"Parallel Project Execution"一樣,"Configure projects on demand"將對這種多專案並且依賴關係複雜的專案產生重要的影響。

Global gradle.properties(Gradle全域性配置檔案)

在Gradle主目錄中定義或者配置的屬性優先順序高於在專案目錄中檔案定義的屬性。原因是你想避免在你的構建伺服器上使用Gradle守護程式,而記憶體消耗肯定是比啟動時間更重要的:

/Users/cesarferreira/.gradle/gradle.properties

# The Gradle daemon aims to improve the startup and execution time of Gradle.
# When set to true the Gradle daemon is to run the build.
org.gradle.daemon=true

# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx10248m -XX:MaxPermSize=256m
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
org.gradle.parallel=true

# Enables new incubating mode that makes Gradle selective when configuring projects.
# Only relevant projects are configured which results in faster builds for large multi-projects.
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:configuration_on_demand
org.gradle.configureondemand=true
複製程式碼

使用Module是有代價的...我的意思是真的有代價!

為了構建我目前的linkedcare專案,我不得不去尋找並且fork一些相對適合但不是特別適合我專案的一些依賴庫。 如果這些模組沒有被不斷修改,考慮這一點非常重要:從頭開始編譯它們,或者甚至是檢查以前的模組是否是最新版本的,所需的時間是直接將該依賴載入為二進位制.jar / .aar的四倍,也就是說每次編譯Gradle都要去檢查依賴是不是最新的,這將花費大量時間。 **提示:**執行gradle build -profile獲取HTML報告,顯示構建過程的時間。 **注意:**在版本控制系統中保留“不必要的”模組,以便於對該依賴的快速修復/改進。

從4分鐘到21秒

基於以上這些優化方式,我們來看看效果:

21秒?好吧,還不算太差

任務執行配置

lint任務

如果你看看你的任務執行配置檔案,你會發現lint任務需要很多時間,你真的需要檢查lint輸出的增量構建嗎? 把它取消吧:

gradle build -x lint

縮短到15秒了,很好!

##12秒減少到8秒

lint vital release還是佔用了比較多時間

另一個lint任務檢查,這個任務幾乎佔據了我們目前構建專案總時間的90%。好吧,現在也將這個任務取消掉:

gradle build -x lint -x lintVitalRelease

哈哈哈哈啊哈哈!一直減少到8秒啦

**提示:**如果要從增量構建中永久跳過lint檢查,可以將其新增到build.gradle中:

tasks.whenTaskAdded { task ->
    if (task.name.equals("lint")) {
        task.enabled = false
    }
}
複製程式碼

總結一下:

  • 在Gradle目錄下有一個全域性gradle.properties,所有的專案將繼承它(Android中Module的單個Gradle配置檔案優先順序低於全域性的);
  • 執行Gradle build profile工具;
  • 堅持基本模組依賴(基於配置檔案工具結果);
  • 跳過不成功的Gradle任務;

聯絡原文作者:

如果您有任何問題或想要分享您的結果->我的twitter @cesarmcferreira☺

相關文章