Gradle build 太慢,可能是你使用的姿勢不對


之前我司每個 Java 應用部署到預發都要等待漫長的編譯打包時間,非常地痛苦!大項目編譯時間常常達到接近 10 分鍾,生命短暫啊,人生有多少個 10 分鍾可以等待,於是我的效能團隊針對編譯作了一些優化,提速非常明顯,對某個應用的測試來看,編譯時間從 160 s 縮短到了 50 s 左右,提升近 70%,大家紛紛點贊,那么效能團隊做了哪些措施來讓編譯速度提升這么明顯呢?

首先要說的是我們用的 Gradle 來作為我們的構建工具,所以主要是針對 Gradle 的命令來作了一些優化

1、修改 gradle build 的參數

  • 使用 --build-cache

什么是 build cache(構建緩存),在 Gradle 中,每一個待編譯的工程叫 Project,每一個 Project 在構建時都包含一系列的 task

每個 task 的輸入都可以作為下一個 task 的輸出,build cache 做的事就是把可以緩存(注:並不是所有的 task 輸出都能緩存)的 task 輸出都緩存住,這樣在構建過程中,如果發現這個 task 的輸入不變,就沒必要重新執行任務了,直接從 task ouput 緩存里拿即可,如下圖示,Build 2 的構建輸入直接從 Build Cache 中拿,這樣 Build 1 就不用構建了。


效果怎么樣呢,看下圖,下面圖分別顯示了 Gradle 持續集成時使用構建緩存和不使用構建緩存兩種情況下的聚合的構建時間,可以看到使用了 cache 的 Gradle 構建速度明顯快於不使用 cache 的情況

更騷的是這個 Buiid Cache 支持分布式的,可以統一把這些 cache 丟到一台機器上,本地機器要編譯時統一去這台機器拉 cache,這樣如果我們切換分支時執行構建也能用 Build Cache 來加快構建速度

--build-cache 的具有使用需要注意一些事項,比如得 Gradle 4.3 以上才有效,建議大家直接去官網查查看

  • 增加 --parallel 參數

並行執行在多項目編譯的項目中能有效提升編譯的速度,但是並行執行的前提是每個項目已經被模塊化,每個項目之間沒有耦合。

  • 移除 --refresh-dependencies 參數

原來 gradle build 有加這個參數,這個參數會忽略緩存,強制重新下載,顯然是編譯的瓶頸

2、任務並行

原來 Jenkins 中執行 Gradle 編譯任務,每個 Task 是串行執行的,總編譯耗時是每個任務執行時間的總和。

現在把它改成了並行的


顯然並行執行會快得多

3、將大項目工程中的常用代碼抽成 jar 包

對於業務方來說,采用這種方式也是提升編譯速度的有效手段 ,將大量代碼抽成 jar 包,意味着它們本身就是字段碼了,在 gradle build 時就不用編譯啦。

希望本文對你有幫助,記得點個在看哦 ^_^

歡迎關注公號,共同交流學習


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM