加速 gradle 編譯之遮蔽部分 Task | 掘金技術徵文

南無大乘妙法蓮華經發表於2016-12-25

靈感來源

首先祝大家聖誕快樂! :smile: :+1:

該篇部落格靈感來自之前的一片部落格:

Android Studio clean 時產生 Error:Execution failed for task ':app:mockableAndroidJar' > java.lang.NullPointerException (no error message)

和一個神庫的issue:

android-hidden-api#21

首先簡單介紹下這個神庫——android-hidden-api: 可以讓你使用安卓系統中 internal/hidden 的方法。

比如, Activity 裡有一個@hide的方法:

/**
 * @hide
 */
public final boolean isResumed() {
    return mResumed;
}複製程式碼

沒用該庫之前引用這個方法會報找不到該方法:

加速 gradle 編譯之遮蔽部分 Task | 掘金技術徵文
isResumed

但是使用該庫後, 編譯正常:

加速 gradle 編譯之遮蔽部分 Task | 掘金技術徵文
isResumed internal

編譯通過了, 實際執行怎麼樣呢, 該方法可執行正常, 但是不保證所有系統, 同時也不能保證所有內部方法可執行。褲子不錯, 不要貪用哦, 要多測試, 並加入異常處理。

詳細使用可參考鴻神之前的文章:

Android 輕鬆的檢視與使用hide與internal API

加速gradle編譯

1 常用的加速方法, 大家可能都配置好了, 主要下面幾個:

  • 開啟gradle單獨的守護程式
    在gradle.properties檔案中輸入如下程式碼:
org.gradle.daemon=true
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
org.gradle.parallel=true
org.gradle.configureondemand=true複製程式碼

當然,上面的這些引數也可以配置到前面的使用者目錄下的gradle.properties檔案裡,那樣就不是針對一個專案生效,而是針對所有專案生效。
gradle.properties配置檔案主要就是增大gradle執行的java虛擬機器的大小,讓gradle在編譯的時候使用獨立程式,讓gradle可以平行的執行。

  • 申請大記憶體

as安裝目錄/bin/studio64.vmoptions or studio.vmoptions(linux下,其他系統找類似檔案)
使用文字編輯器開啟,找到起始兩行,如下
-Xms128m
-Xmx750m

修改最小值和最大值,建議為
-Xms256m
-Xmx2048m

  • incremental dex
    改變incremental dexing的值,這是一個實驗的功能並且預設是關閉的。開啟這個開關有可能會導致構建失敗,錯誤資訊類似jdk finished with non-zero exit value 2
    (尤其是在連續執行的時候),但我還是推薦你嘗試一下,看看它是否對你有用。

在主APP模組的build.gradle檔案中,新增下面的程式碼:

dexOptions {
    incremental true
}複製程式碼

2 遮蔽部分Task

我們知道, 編譯的時候, 是有很多Task執行的, 可在右側 gradle 標籤下看到:

加速 gradle 編譯之遮蔽部分 Task | 掘金技術徵文
gradle tasks

當我們正常編譯的時候, 這些Task都是會執行的, 我們看下編譯log:

加速 gradle 編譯之遮蔽部分 Task | 掘金技術徵文
gradle uptodate

很多Task後面都有 UP-TO-DATE也就是Task已是最新, 這些基本不耗時, 其他都耗時, 專案大, 同時依賴多個庫, 那麼慢是正常的了...

下面, 哦,,, 沒錯, 就是下面,

遮蔽不需要的Task, 比如一些測試Task, 中間含有Test的一些Task, 把這些遮蔽掉:

在專案的根build.gradle指令碼里新增遮蔽Task的程式碼:

allprojects {
    repositories {
        jcenter()
    }

    //skip Test tasks
    gradle.taskGraph.whenReady {
        tasks.each { task ->
            if (task.name.contains("Test"))
            {
                task.enabled = false
            }
        }
    }

}複製程式碼

這樣sync, 編譯, 見證奇蹟的時刻:

加速 gradle 編譯之遮蔽部分 Task | 掘金技術徵文
task skipped

Oh, 聖誕快樂 :smile: 沒錯, 好多Task後面被標記了SKIPPED, 那這些Task都被無情的忽視了, 酸爽。

當然還可以遮蔽掉其他Task, 歡迎討論。編譯時間的提升效果還是很明顯的, 專案越大越明顯。

到這裡就差不多了, 當然, 網上還有很多加速編譯的方法, 最好用的還是阿里的

秒級編譯工具freeline

這個還沒使用的, 趕緊用起來, 趕緊用起來, 趕緊用起來, 不解釋。

到這裡該說再見了, 有任何問題歡迎評論, 感謝您的閱讀, 聖誕快樂!

掘金技術徵文:
gold.xitu.io/post/58522d…

相關文章