詳解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
以上就是詳解Gradle構建過程的詳細內容,更多關於Gradle構建過程的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- 現代高效的java構建工具gradle的快速入門
- Gradle Build Cache引發的Task緩存編譯問題
- 一款Android APK的結構構成解析
- Android開發之Gradle 進階Tasks深入瞭解
- 使用Composing builds提升Android編譯速度