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

靈感來源

首先祝你們聖誕快樂! :smile: :+1:javascript

該篇博客靈感來自以前的一片博客:java

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

和一個神庫的issue:android

android-hidden-api#21git

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

好比, Activity 裏有一個@hide的方法:github

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

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

isResumed

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

isResumed internal

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

詳細使用可參考鴻神以前的文章:編輯器

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 tasks

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

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, 編譯, 見證奇蹟的時刻:

task skipped

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

固然還能夠屏蔽掉其餘Task, 歡迎討論。編譯時間的提高效果仍是很明顯的, 項目越大越明顯。

到這裏就差很少了, 固然, 網上還有不少加速編譯的方法, 最好用的仍是阿里的

秒級編譯工具freeline

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

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

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

相關文章
相關標籤/搜索