加快gradle構建速度

1,開啓守護進程。

這一點在許多問答網站,博客等,都會提到。通過開啓守護進程,下一次構建的時候,將會連接這個守護進程進行構建,而不是重新fork一個gradle構建進程。通過在~/.gradle(如果是windows下,則爲用戶目錄下的.gradle文件夾,如果配置過 GRADLE_USER_HOME,則爲該目錄)中編輯(如果沒有則創建)gradle.properties,加入以下配置,可以讓所有項目在構建時都開啓守護進程:


[plain] view plain copy
  1. org.gradle.daemon=true  

2,開啓並行編譯

這一點同上,也是常見的加快編譯速度的方法。在多項目(或多模塊)編譯時它會很有用。同樣在~/.gradle/gradle.properties中加入:

[plain] view plain copy
  1. org.gradle.parallel=true  

3,使用新版的gradle和android gradle plugin。

然而,在加上這兩行之後,隨着項目開發的逐漸複雜,引入的庫也越來越多,項目本身也要增加一些productFlavor,速度又開始慢起來。後來Android Studio升級,Gradle升級,看到Gradle 2.4的升級說明上提到提高了gradle的構建速度,於是用了新版的Gradle,果然提高了些許速度。

編輯項目根目錄下的build.gradle,把android gradle plugin更新到新版本:

[plain] view plain copy
  1. classpath 'com.android.tools.build:gradle:1.3.0'  

如果是使用本地的gradle,則下載新的版本,並且更新新版本的gradle到path的環境變量中。如果是使用gradlew構建,則編輯項目根目錄下的gradle/wrapper/gradle-wrapper.properties,把gradle改爲2.4或更新的版本。

[plain] view plain copy
  1. distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip  

4,命令行構建。

在Android Studio中,點擊運行時它是將當前的構建任務加入到隊列中。也就是,如果你改過build.gradle的文件導致它在同步腳本時,就必須等到這個任務完成之後纔會執行你剛纔的構建任務。作爲命令行控的我,首先還是用命令行構建了。

[plain] view plain copy
  1. ./gradlew assembleRelease  
上面的任務還可以簡寫爲:

[plain] view plain copy
  1. ./gradlew aR  

由於我這裏的項目中因需要而創建了幾個productFlavor:Develop, Test, Official。所以如果使用./gradlew aR的話,它會同時構建這三個的release版本。而實際上,我在開發的時候只需要構建Develop這一個,所以命令改爲如下:

[plain] view plain copy
  1. ./gradlew aDR  

5,屏蔽不必要的productFlavor

在使用命令行的構建過程中,我發現儘管我只是要構建Develop版本,但是它還是會去解析每一個productFlavor的依賴,並且在依賴上卡很久。所以在構建時先註釋掉了其他兩個pruductFlavor,果然在解析依賴的這一步就節省了一半以上的時間。在不clean的情況下,之前構建一次接近三分鐘,現在不到兩分鐘。


6,使用離線模式。

我發現在構建過程中,除了修改了java文件然後在multldex時有點耗時之外,最大的耗時都在於resolving dependencies,也就是解析依賴的這一步。而我的項目這時候的依賴應該都在本地中有緩存了。所以使用--offline,讓它不去聯網檢查更新。

[plain] view plain copy
  1. ./gradlew aDR --offline  

因爲是構建過的,所以只需要3.846秒。而即使是clean,構建的時間也只需要47.175秒(並不是每一次都是這個時間,有時間會比較大,多構建幾次會快一些)。

7,不使用snapshot依賴倉庫

現在的速度已經和以前一樣快了,但是在Android Studio中直接點運行,總比在命令行執行./gradlew aDR --offline && adb install -r app/build/outputs/apk/xxxxxx.apk要更方便些,而如果在Android Studio中開啓offline mode的話,下次更新依賴又要去取消掉它或者在命令行下更新一次依賴。所以我決定再找找gradle不開離線模式下變慢的原因。

命令行下執行:

[plain] view plain copy
  1. ./gradlew aDR --info  

讓gradle在構建過程中打印消息日誌。

結果發現,有一些android support庫,它會去我聲明的一個SNAPSHOT倉庫中去找,因爲找不到,所以在這一步會耗時很多。特別是我有3個productFlavor的情況下,每一個flavor的依賴都要去解析一遍,這樣就要消耗三倍的時間。

之所以會聲明這個SNAPSHOT倉庫,是因爲項目中用到了JakeWharton大神的ViewPagerIndicator,而他的這個庫已經兩年沒維護,裏面有幾個bug沒有修復。我在修復之後,又加了一點新的功能,就準備發佈到2.5版本,由於還沒怎麼測過,所以只是作爲SNAPSHOT版本發在了oss.jfrog.org上。於是切換到ViewPagerIndicator項目,把我的改動發到了jcenter中,然後項目的依賴改爲2.5版本而不是2.5-SNAPSHOT,然後在依賴庫聲明爲,把這個依賴倉庫給註釋掉。

先構建一下,下載ViewPagerIndicator 2.5的依賴。然後我們再運行一遍,看一下速度:

[html] view plain copy
  1. ./gradlew aDR  
現在解析依賴變得很快,一秒不到就完成了。由於是編譯過的,所以整個過程很快,3.092秒,和offline模式下相同(這點時間上的差別,並不能因此說它比offline下更快,即使是相同的構建,偶爾也會有一點時間上的差別)。

再看一下clean後再編譯的情況:

[plain] view plain copy
  1. ./gradlew clean aDR  

只需要47.912秒。已經和--offline下一樣了。


從以上過程中可以總結出加快構建速度的技巧如下:

開啓守護進程,開啓並行編譯,使用新版本的android gradle plugin, 使用新版本的Android Studio(它會使用新版本的Tools api去調用gradle),使用新版本的Gradle,使用命令行構建(如果你實在等不級Android Studio中還未執行完的其他任務),構建時減少productFlavor,避免使用SNAPSHOT版本及使用SNAPSHOT倉庫,使用離線模式(如果允許),如果沒必要則不需要在構建時進行clean。


據說,facebook出了一個新的構建系統,可以構建android, ios, cpp, java, python, go等項目,支持linux, mac(windows?呵呵)。還據說,微信也在使用這個構建系統。接下來我要去了解一下它了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章