欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Gradle構(gòu)建過程

 更新時(shí)間:2021年06月09日 11:20:17   作者:lsgxeva  
Gradle是項(xiàng)目構(gòu)建工具,是Google官方推薦的Android項(xiàng)目編譯工具。構(gòu)建工具是可以讓開發(fā)者以可執(zhí)行和有序的任務(wù)來表達(dá)自動(dòng)化的需求。就是將源代碼生成可執(zhí)行程序。本文將詳細(xì)介紹Gradle構(gòu)建過程

Gradle構(gòu)建過程

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

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

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

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

setting.gradle 執(zhí)行結(jié)束的監(jiān)聽

//1.setting.gradle 執(zhí)行結(jié)束的監(jiān)聽
gradle.settingsEvaluated {
    println "settings.gradle 初始化執(zhí)行結(jié)束"
}

參與構(gòu)建的Project對(duì)象創(chuàng)建完畢的監(jiān)聽

//2.參與構(gòu)建的Project對(duì)象創(chuàng)建完畢的監(jiān)聽
gradle.projectsLoaded {
    Gradle gradle ->
        println "settings.gradle 所有在 settings 中 include 的 Project 都創(chuàng)建完成了"
}

監(jiān)聽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 + " 配置開始前回調(diào)"
}

project.beforeEvaluate

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

通過 gradle.afterProject 和 project.afterEvaluate 是差不多一下的。

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

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)聽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)建完畢"
}

計(jì)算 build 任務(wù)的執(zhí)行時(shí)長

在 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í)長啦。

下面是具體的步驟:

  • 通過 project(":app") 對(duì) app module 單獨(dú)配置。
  • 通過 project.afterEvaluate 監(jiān)聽 project 配置完畢。
  • 通過 getBuildTask 獲取 preBuild 和 build 兩個(gè)任務(wù)對(duì)象。
  • 監(jiān)聽 preBuild.doFirst 得到開始執(zhí)行的時(shí)間戳。
  • 監(jiān)聽 build.doLast 得到執(zhí)行完畢的時(shí)間戳。
  • 最后得到兩個(gè)時(shí)間戳的差值即是該任務(wù)的執(zhí)行市場。
  • 執(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)聽獲取在preBuild執(zhí)行之前的時(shí)間戳的 action 
            preBuildTask.doFirst {
                taskStartTime = System.currentTimeMillis()
            }
            //在build task 中追加一個(gè)監(jiān)聽獲取執(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

以上就是詳解Gradle構(gòu)建過程的詳細(xì)內(nèi)容,更多關(guān)于Gradle構(gòu)建過程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Android RecyclerView加載不同布局簡單實(shí)現(xiàn)

    Android RecyclerView加載不同布局簡單實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了Android RecyclerView加載不同布局簡單實(shí)現(xiàn),感興趣的小伙伴們可以參考一下
    2016-08-08
  • 詳解Android Lint的原理及其使用

    詳解Android Lint的原理及其使用

    這篇文章主要介紹了詳解Android Lint的原理及其使用,想了解Lint的同學(xué),一定要著重看一下
    2021-04-04
  • Android登錄代碼MVP架構(gòu)詳解

    Android登錄代碼MVP架構(gòu)詳解

    這篇文章主要為大家詳細(xì)介紹了Android登錄代碼MVP架構(gòu)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • Android APP之WebView校驗(yàn)SSL證書的方法

    Android APP之WebView校驗(yàn)SSL證書的方法

    這篇文章主要介紹了Android APP之WebView校驗(yàn)SSL證書的方法,需要的朋友可以參考下
    2017-09-09
  • Android?Adapter適配器使用示例講解

    Android?Adapter適配器使用示例講解

    這篇文章主要為大家介紹了Android?Adapter適配器使用示例講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Android Studio配置(Android Studio4.1為例)

    Android Studio配置(Android Studio4.1為例)

    這篇文章主要介紹了Android Studio配置(Android Studio4.1為例),文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 詳解Android中實(shí)現(xiàn)ListView左右滑動(dòng)刪除條目的方法

    詳解Android中實(shí)現(xiàn)ListView左右滑動(dòng)刪除條目的方法

    這篇文章主要介紹了Android中實(shí)現(xiàn)ListView左右滑動(dòng)刪除條目的方法,文中分別展示了通過Scroller和NineOldAndroids來實(shí)現(xiàn)的例子,需要的朋友可以參考下
    2016-04-04
  • Android中GIF動(dòng)圖的播放控制和監(jiān)聽詳解

    Android中GIF動(dòng)圖的播放控制和監(jiān)聽詳解

    android下播放gif圖片功能似乎并不常用,很多時(shí)候還是以展示靜態(tài)圖片為主,可能是由于gif圖體積比較大吧。不過像表情動(dòng)畫什么的,可能還是需要gif圖的。本文主要給大家介紹了關(guān)于Android中GIF動(dòng)圖的播放控制和監(jiān)聽的相關(guān)資料,需要的朋友可以參考下。
    2017-05-05
  • Android ViewModel與Lifecycles和LiveData組件用法詳細(xì)講解

    Android ViewModel與Lifecycles和LiveData組件用法詳細(xì)講解

    JetPack是一個(gè)開發(fā)組件工具集,他的主要目的是幫助我們編寫出更加簡潔的代碼,并簡化我們的開發(fā)過程。JetPack中的組件有一個(gè)特點(diǎn),它們大部分不依賴于任何Android系統(tǒng)版本,這意味者這些組件通常是定義在AndroidX庫當(dāng)中的,并且擁有非常好的向下兼容性
    2023-01-01
  • Android檢查手機(jī)網(wǎng)絡(luò)狀態(tài)及網(wǎng)絡(luò)類型的方法

    Android檢查手機(jī)網(wǎng)絡(luò)狀態(tài)及網(wǎng)絡(luò)類型的方法

    這篇文章主要介紹了Android檢查手機(jī)網(wǎng)絡(luò)狀態(tài)及網(wǎng)絡(luò)類型的方法,涉及Android檢測手機(jī)網(wǎng)絡(luò)狀態(tài)的技巧,需要的朋友可以參考下
    2015-04-04

最新評(píng)論