Gradle-構(gòu)建過(guò)程&計(jì)算build執(zhí)行時(shí)長(zhǎng)

# 任務(wù)

  • 圖解 Gradle 構(gòu)建的三個(gè)階段
  • 監(jiān)聽(tīng) Gradle 不同階段的回調(diào)瞎抛;
  • 練習(xí)-計(jì)算 build 任務(wù)的執(zhí)行時(shí)長(zhǎng);

# Gradle 構(gòu)建過(guò)程

下面這張圖是是參考網(wǎng)上的却紧,感覺(jué)寫(xiě)的還不錯(cuò)桐臊。

Gradle構(gòu)建過(guò)程

根據(jù)在上圖中所示,Gradle 的構(gòu)建過(guò)程主要分為三個(gè)階段:

  • 初始化階段
  • 配置階段
  • 執(zhí)行階段

## 監(jiān)聽(tīng) Gradle 初始化時(shí)機(jī)

在這個(gè)初始化階段中主要有兩個(gè)時(shí)機(jī)需要關(guān)注:

  • setting.gradle 執(zhí)行結(jié)束的監(jiān)聽(tīng)
//1.setting.gradle 執(zhí)行結(jié)束的監(jiān)聽(tīng)
gradle.settingsEvaluated {
    println "settings.gradle 初始化執(zhí)行結(jié)束"
}
  • 參與構(gòu)建的Project對(duì)象創(chuàng)建完畢的監(jiān)聽(tīng)
//2.參與構(gòu)建的Project對(duì)象創(chuàng)建完畢的監(jiān)聽(tīng)
gradle.projectsLoaded {
    Gradle gradle ->
        println "settings.gradle 所有在 settings 中 include 的 Project 都創(chuàng)建完成了"
}

## 監(jiān)聽(tīng) Gradle 配置階段時(shí)機(jī)

在 settings.gradle 中可以配置需要參與構(gòu)建的 project 啄寡,并且在初始化階段就已經(jīng)創(chuàng)建好對(duì)應(yīng)的 project 實(shí)例了豪硅。
Gradle 的配置階段就是執(zhí)行每一個(gè) Project 對(duì)應(yīng)的 build.gradle 的配置代碼。

下面相關(guān)的API是關(guān)于配置的回調(diào):

  • gradle.beforeProject

表示對(duì)每一個(gè) project 在執(zhí)行配置代碼之前都會(huì)回調(diào)這個(gè)方法挺物。

gradle.beforeProject {
    Project project ->
        println ">>>>>>>>gradle beforeProject " + project.name + " 配置開(kāi)始前回調(diào)"
}
  • project.beforeEvaluate

當(dāng)前 project在執(zhí)行配置代碼之前的回調(diào)

通過(guò) gradle.afterProject 和 project.afterEvaluate 是差不多一下的懒浮。

this.afterEvaluate {
    project ->
        println project.name + " 配置結(jié)束監(jiān)聽(tīng)"
}
  • gradle.projectsEvaluated

表示所有的 project 都執(zhí)行完對(duì)應(yīng)的 build.gradle 的配置代碼,準(zhǔn)備要去生成對(duì)應(yīng)的 Task 依賴圖识藤。

gradle.projectsEvaluated {
    gradle ->
        println "所有的project都配置完畢了砚著,準(zhǔn)備生成Task依賴關(guān)系"
}
  • gradle.taskGraph.whenReady

表示 "task 依賴關(guān)系已經(jīng)生成"

gradle.taskGraph.whenReady {
    TaskExecutionGraph graph ->
        println "task 依賴關(guān)系已經(jīng)生成"
}

## 監(jiān)聽(tīng) Gradle 執(zhí)行階段時(shí)機(jī)

Gradle 在配置階段中會(huì)執(zhí)行每一個(gè) project 的 build.gradle 的配置代碼,并且最終生成每一個(gè) Task 任務(wù)的依賴關(guān)系痴昧。下面到了執(zhí)行階段就會(huì)根據(jù)這個(gè)依賴關(guān)系去執(zhí)行對(duì)應(yīng)的 Task 任務(wù)稽穆。

  • gradle.taskGraph.beforeTask

每一個(gè) Task 任務(wù)執(zhí)行之前回調(diào)

gradle.taskGraph.beforeTask {
    Task task ->
        println "Project[${task.project.name}]--->Task[${task.name}] 在執(zhí)行之前被回調(diào)"
}
  • gradle.taskGraph.afterTask

每一個(gè) task 執(zhí)行之后被回調(diào)

gradle.taskGraph.afterTask {
    task, TaskState taskState ->
        //第二個(gè)參數(shù)表示 task 的狀態(tài),是可選的參數(shù)
        println "Project[${task.project.name}]--->Task[${task.name}] 在執(zhí)行完畢,taskState[upToDate:${taskState.upToDate},skipped:${taskState.skipped},executed:${taskState.executed},didWork:${taskState.didWork}]"
}

## Gradle 構(gòu)建執(zhí)行結(jié)束的回調(diào)

  • gradle.buildFinished

當(dāng)所有的任務(wù)執(zhí)行完畢的回調(diào)

gradle.buildFinished {
    BuildResult buildResult ->
        println "構(gòu)建完畢"
}

練習(xí)-計(jì)算 build 任務(wù)的執(zhí)行時(shí)長(zhǎng)

在 Android 中 build 的執(zhí)行是最為復(fù)雜赶撰,也是執(zhí)行時(shí)間最久的一個(gè) Task 舌镶,因?yàn)?build 這個(gè)任務(wù)依賴了很多其他的任務(wù),第一個(gè)被依賴的任務(wù)是 preBuild 豪娜,因此我們希望在 preBuild 執(zhí)行之前記錄當(dāng)前的時(shí)間戳taskStartTime餐胀,在 build 執(zhí)行完畢之后記錄當(dāng)前的時(shí)間戳taskEndTime,然后計(jì)算兩個(gè)時(shí)間戳的差值即是 build 任務(wù)的執(zhí)行時(shí)長(zhǎng)啦瘤载。

下面是具體的步驟:

  • 通過(guò) project(":app") 對(duì) app module 單獨(dú)配置否灾。
  • 通過(guò) project.afterEvaluate 監(jiān)聽(tīng) project 配置完畢。
  • 通過(guò) getBuildTask 獲取 preBuild 和 build 兩個(gè)任務(wù)對(duì)象鸣奔。
  • 監(jiān)聽(tīng) preBuild.doFirst 得到開(kāi)始執(zhí)行的時(shí)間戳墨技。
  • 監(jiān)聽(tīng) build.doLast 得到執(zhí)行完畢的時(shí)間戳惩阶。
  • 最后得到兩個(gè)時(shí)間戳的差值即是該任務(wù)的執(zhí)行市場(chǎng)。
  • 執(zhí)行 build 任務(wù)扣汪。
//配置 app module
project(":app") {
    Project project ->
        project.afterEvaluate {
            //獲取build task 任務(wù)
            Task buildTask = getBuildTask(project, ":app:build")
            //獲取 preBuild 任務(wù)
            Task preBuildTask = getBuildTask(project, ":app:preBuild")

            def taskStartTime = 0
            def taskEndTime = 0

            //在preBuild task 中追加一個(gè)監(jiān)聽(tīng)獲取在preBuild執(zhí)行之前的時(shí)間戳的 action 
            preBuildTask.doFirst {
                taskStartTime = System.currentTimeMillis()
            }
            //在build task 中追加一個(gè)監(jiān)聽(tīng)獲取執(zhí)行完畢的時(shí)間戳的 action 
            buildTask.doLast {
                taskEndTime = System.currentTimeMillis()
                println "build task 執(zhí)行時(shí)間:${taskEndTime - taskStartTime}"
            }
        }
}

/**
 * 獲取該project對(duì)應(yīng)的build任務(wù)
 * @param project
 * @return
 */
Task getBuildTask(Project project, String taskPath) {

    //獲取該project管理task的容器
    TaskContainer taskContainer = project.getTasks()

    //拿到build的Task對(duì)象
    Task buildTask = taskContainer.getByPath(taskPath)

    return buildTask
}

執(zhí)行 build 任務(wù)

./gradlew build

記錄于 2018-07-26 晚

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末断楷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子崭别,更是在濱河造成了極大的恐慌脐嫂,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件紊遵,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡侥蒙,警方通過(guò)查閱死者的電腦和手機(jī)暗膜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鞭衩,“玉大人学搜,你說(shuō)我怎么就攤上這事÷垩埽” “怎么了瑞佩?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)坯台。 經(jīng)常有香客問(wèn)我炬丸,道長(zhǎng),這世上最難降的妖魔是什么蜒蕾? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任稠炬,我火速辦了婚禮,結(jié)果婚禮上咪啡,老公的妹妹穿的比我還像新娘首启。我一直安慰自己,他們只是感情好撤摸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布毅桃。 她就那樣靜靜地躺著,像睡著了一般准夷。 火紅的嫁衣襯著肌膚如雪钥飞。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天冕象,我揣著相機(jī)與錄音代承,去河邊找鬼。 笑死渐扮,一個(gè)胖子當(dāng)著我的面吹牛论悴,可吹牛的內(nèi)容都是我干的掖棉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼膀估,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼幔亥!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起察纯,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤帕棉,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后饼记,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體香伴,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年具则,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了即纲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡博肋,死狀恐怖低斋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情匪凡,我是刑警寧澤膊畴,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站病游,受9級(jí)特大地震影響唇跨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜衬衬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一轻绞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧佣耐,春花似錦政勃、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至讽挟,卻和暖如春懒叛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背耽梅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工薛窥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓诅迷,卻偏偏與公主長(zhǎng)得像佩番,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子罢杉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • http://www.reibang.com/p/7c288a17cda8 總的來(lái)說(shuō)趟畏,Android的系統(tǒng)體系結(jié)...
    燕京博士閱讀 1,200評(píng)論 0 6
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)滩租,斷路器赋秀,智...
    卡卡羅2017閱讀 134,659評(píng)論 18 139
  • 語(yǔ)法等 定語(yǔ):修飾限定名詞的成分。狀語(yǔ):修飾V.adj.adv.或全句律想。同位語(yǔ):對(duì)某名詞/詞組做進(jìn)一步解釋說(shuō)明猎莲。與...
    法雲(yún)閱讀 394評(píng)論 0 0
  • 小的時(shí)候,家里窮技即。平日里也就是粗茶淡飯益眉,那時(shí)我們吃白面饅頭都還不能放開(kāi)吃,母親也經(jīng)常會(huì)做一些窩窩頭姥份,家里有果園,她...
    陪月亮摘星星閱讀 520評(píng)論 23 36
  • 我說(shuō)過(guò)年碘,我一直都是一個(gè)淡淡的人澈歉,對(duì)于感情如此,沒(méi)有轟轟烈烈屿衅,沒(méi)有情深似海埃难。對(duì)于懷孕也是如此,沒(méi)有那么多思前想后涤久,也...
    saysay閱讀 251評(píng)論 0 0