Gradle-構建過程&計算build執行時長


Gradle-構建過程&計算build執行時長

來源 https://www.jianshu.com/p/e7a40a592f15

 

# 任務

  • 圖解 Gradle 構建的三個階段
  • 監聽 Gradle 不同階段的回調;
  • 練習-計算 build 任務的執行時長;

# Gradle 構建過程

下面這張圖是是參考網上的,感覺寫的還不錯。

 
Gradle構建過程
 

根據在上圖中所示,Gradle 的構建過程主要分為三個階段:

  • 初始化階段
  • 配置階段
  • 執行階段

## 監聽 Gradle 初始化時機

在這個初始化階段中主要有兩個時機需要關注:

  • setting.gradle 執行結束的監聽
//1.setting.gradle 執行結束的監聽
gradle.settingsEvaluated {
    println "settings.gradle 初始化執行結束"
}
  • 參與構建的Project對象創建完畢的監聽
//2.參與構建的Project對象創建完畢的監聽
gradle.projectsLoaded {
    Gradle gradle ->
        println "settings.gradle 所有在 settings 中 include 的 Project 都創建完成了"
}

## 監聽 Gradle 配置階段時機

在 settings.gradle 中可以配置需要參與構建的 project ,並且在初始化階段就已經創建好對應的 project 實例了。
Gradle 的配置階段就是執行每一個 Project 對應的 build.gradle 的配置代碼。

下面相關的API是關於配置的回調:

  • gradle.beforeProject

表示對每一個 project 在執行配置代碼之前都會回調這個方法。

gradle.beforeProject {
    Project project ->
        println ">>>>>>>>gradle beforeProject " + project.name + " 配置開始前回調"
}
  • project.beforeEvaluate

當前 project在執行配置代碼之前的回調

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

this.afterEvaluate {
    project ->
        println project.name + " 配置結束監聽"
}
  • gradle.projectsEvaluated

表示所有的 project 都執行完對應的 build.gradle 的配置代碼,准備要去生成對應的 Task 依賴圖。

gradle.projectsEvaluated {
    gradle ->
        println "所有的project都配置完畢了,准備生成Task依賴關系"
}
  • gradle.taskGraph.whenReady

表示 "task 依賴關系已經生成"

gradle.taskGraph.whenReady {
    TaskExecutionGraph graph ->
        println "task 依賴關系已經生成"
}

## 監聽 Gradle 執行階段時機

Gradle 在配置階段中會執行每一個 project 的 build.gradle 的配置代碼,並且最終生成每一個 Task 任務的依賴關系。下面到了執行階段就會根據這個依賴關系去執行對應的 Task 任務。

  • gradle.taskGraph.beforeTask

每一個 Task 任務執行之前回調

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

每一個 task 執行之后被回調

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

## Gradle 構建執行結束的回調

  • gradle.buildFinished

當所有的任務執行完畢的回調

gradle.buildFinished {
    BuildResult buildResult ->
        println "構建完畢"
}

練習-計算 build 任務的執行時長

在 Android 中 build 的執行是最為復雜,也是執行時間最久的一個 Task ,因為 build 這個任務依賴了很多其他的任務,第一個被依賴的任務是 preBuild ,因此我們希望在 preBuild 執行之前記錄當前的時間戳taskStartTime,在 build 執行完畢之后記錄當前的時間戳taskEndTime,然后計算兩個時間戳的差值即是 build 任務的執行時長啦。

下面是具體的步驟:

  • 通過 project(":app") 對 app module 單獨配置。
  • 通過 project.afterEvaluate 監聽 project 配置完畢。
  • 通過 getBuildTask 獲取 preBuild 和 build 兩個任務對象。
  • 監聽 preBuild.doFirst 得到開始執行的時間戳。
  • 監聽 build.doLast 得到執行完畢的時間戳。
  • 最后得到兩個時間戳的差值即是該任務的執行市場。
  • 執行 build 任務。
//配置 app module
project(":app") {
    Project project ->
        project.afterEvaluate {
            //獲取build task 任務
            Task buildTask = getBuildTask(project, ":app:build")
            //獲取 preBuild 任務
            Task preBuildTask = getBuildTask(project, ":app:preBuild")

            def taskStartTime = 0
            def taskEndTime = 0

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

/**
 * 獲取該project對應的build任務
 * @param project
 * @return
 */
Task getBuildTask(Project project, String taskPath) {

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

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

    return buildTask
}

執行 build 任務

./gradlew build

============= End
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM