做者:Ailurus
連接:https://www.zhihu.com/question/27953288/answer/118031242
來源:知乎
著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
html
至於加快編譯速度,有一句說一句,我覺着一些答主的答案適用性都並不強,其實仍是應該從 gradle 入手,講的有什麼不合適的地方,還請輕噴,有什麼問題也能夠留言。java
如下我講到的全部步驟,推薦都在終端裏執行。在終端裏執行編譯有不少好處:android
先說一下 gradle 的生命週期吧,gradle 構建一個工程主要分爲三部分(徹底掌握了下面這張圖,整個 gradle 的構建過程能瞭解個十之七八了):git
compileDebugJavaWithJavac/compileReleaseJavaWithJavac和 將 class 合併成 dex
transformClassesWithDexForDebug/transformClassesWithDexForRelease這兩步很耗時,第一步還好,第二步會耗時很是久。首先在 gradle.properties 裏設置
org.gradle.jvmargs=-Xmx4096m //越大越好,而後在工程的 build.gradle 裏的 android 結點下增長 dexOptions 配置,以下:
dexOptions { dexInProcess true preDexLibraries true javaMaxHeapSize "4g"//越大越好 incremental true }
明確了 gradle 的生命週期,那麼就能夠看到加快編譯速度的關鍵就是從第三步入手,固然,減小 setting.gradle 裏的 modules 數量這一步也是必須的。下面說說咱們公司的實踐吧。github
上面講到的幾點,現有環境就能夠作到的大概是這樣(有一點要特別注意,若是工程裏有交叉依賴,必定不要使用 --parallel 參數):微信
gradle assembleDebug --daemon --parallel -x lint -x test
,若是是要直接安裝到設備上的話,就把 assembleDebug 換成 installDebug ,assembleDebug 能夠簡寫爲 asD ,installDebug 能夠簡寫爲 iD 。jvm
最後講一下,爲何減小 setting.gradle 裏的 module 數量,確實能夠加快編譯,可是卻限制頗多呢?
首先,咱們想一下整個編譯過程,先去解析 gradle 配置,創建 tasks 依賴有向圖,而後再去執行每個 module 的 task ,若是咱們經過 maven 依賴,使用 aar 替掉了 module(單指 android library),若是咱們要改這個 module 裏的文件,豈不是每次都要修改上傳再下載,這其實還好,可是有一個致命的問題:不修改版本號的話,SNAPSHOT 在 IDEA 裏常常會很差使。這樣就致使修改的東西會不生效,去解決這個問題是很是耗費時間的。不過有一種方式,能夠必定程度上解決問題,增長下面的腳本:maven
project.configurations.all(new Action<Configuration>() { @Override void execute(Configuration files) { files.resolutionStrategy.cacheDynamicVersionsFor(5, TimeUnit.MINUTES) files.resolutionStrategy.cacheChangingModulesFor(0, TimeUnit.SECONDS) } })
那有人會問,插件化裏,每一個人開發一個模塊,對於每一個模塊的維護不也是要打包上傳到 maven ,每次一有修改,哪怕是很是微小的修改,也要作一次上傳,一樣會遇到 SNAPSHOT 很差使的問題。嘿嘿,這個問題嘛,我司本身維護了一個 gradle 插件,已經解決了,至於解決方案,是公司機密,我是不會講的。
而後,還有一點,我相信大部分開發者日常開發都是單 module 的,多 module 的狀況並很少,所以大多數依賴基本也都是 aar 或者 jar ,根本就不存在所謂的將 library 轉成 aar 上傳的狀況,所以一些答主說的根本毫無心義,這也是爲何我會說影響編譯速度的狀況主要集中在 gradle 生命週期的第三個階段,至於第三個階段的優化,看我上面的答案就行了。ide