1,開啓守護進程。
這一點在許多問答網站,博客等,都會提到。通過開啓守護進程,下一次構建的時候,將會連接這個守護進程進行構建,而不是重新fork一個gradle構建進程。通過在~/.gradle(如果是windows下,則爲用戶目錄下的.gradle文件夾,如果配置過 GRADLE_USER_HOME,則爲該目錄)中編輯(如果沒有則創建)gradle.properties,加入以下配置,可以讓所有項目在構建時都開啓守護進程:
- org.gradle.daemon=true
2,開啓並行編譯
這一點同上,也是常見的加快編譯速度的方法。在多項目(或多模塊)編譯時它會很有用。同樣在~/.gradle/gradle.properties中加入:
- org.gradle.parallel=true
3,使用新版的gradle和android gradle plugin。
然而,在加上這兩行之後,隨着項目開發的逐漸複雜,引入的庫也越來越多,項目本身也要增加一些productFlavor,速度又開始慢起來。後來Android Studio升級,Gradle升級,看到Gradle 2.4的升級說明上提到提高了gradle的構建速度,於是用了新版的Gradle,果然提高了些許速度。
編輯項目根目錄下的build.gradle,把android gradle plugin更新到新版本:
- classpath 'com.android.tools.build:gradle:1.3.0'
如果是使用本地的gradle,則下載新的版本,並且更新新版本的gradle到path的環境變量中。如果是使用gradlew構建,則編輯項目根目錄下的gradle/wrapper/gradle-wrapper.properties,把gradle改爲2.4或更新的版本。
- distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip
4,命令行構建。
在Android Studio中,點擊運行時它是將當前的構建任務加入到隊列中。也就是,如果你改過build.gradle的文件導致它在同步腳本時,就必須等到這個任務完成之後纔會執行你剛纔的構建任務。作爲命令行控的我,首先還是用命令行構建了。
- ./gradlew assembleRelease
- ./gradlew aR
由於我這裏的項目中因需要而創建了幾個productFlavor:Develop, Test, Official。所以如果使用./gradlew aR的話,它會同時構建這三個的release版本。而實際上,我在開發的時候只需要構建Develop這一個,所以命令改爲如下:
- ./gradlew aDR
5,屏蔽不必要的productFlavor
在使用命令行的構建過程中,我發現儘管我只是要構建Develop版本,但是它還是會去解析每一個productFlavor的依賴,並且在依賴上卡很久。所以在構建時先註釋掉了其他兩個pruductFlavor,果然在解析依賴的這一步就節省了一半以上的時間。在不clean的情況下,之前構建一次接近三分鐘,現在不到兩分鐘。
6,使用離線模式。
我發現在構建過程中,除了修改了java文件然後在multldex時有點耗時之外,最大的耗時都在於resolving dependencies,也就是解析依賴的這一步。而我的項目這時候的依賴應該都在本地中有緩存了。所以使用--offline,讓它不去聯網檢查更新。
- ./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不開離線模式下變慢的原因。
命令行下執行:
- ./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的依賴。然後我們再運行一遍,看一下速度:
- ./gradlew aDR
再看一下clean後再編譯的情況:
- ./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?呵呵)。還據說,微信也在使用這個構建系統。接下來我要去了解一下它了。