詳解Gradle構(gòu)建過程
Gradle構(gòu)建過程
根據(jù)在上圖中所示,Gradle 的構(gòu)建過程主要分為三個階段:
- 初始化階段
- 配置階段
- 執(zhí)行階段
監(jiān)聽Gradle初始化時機
在這個初始化階段中主要有兩個時機需要關(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對象創(chuàng)建完畢的監(jiān)聽
//2.參與構(gòu)建的Project對象創(chuàng)建完畢的監(jiān)聽 gradle.projectsLoaded { Gradle gradle -> println "settings.gradle 所有在 settings 中 include 的 Project 都創(chuàng)建完成了" }
監(jiān)聽Gradle配置階段時機
在 settings.gradle 中可以配置需要參與構(gòu)建的 project ,并且在初始化階段就已經(jīng)創(chuàng)建好對應(yīng)的 project 實例了。
Gradle 的配置階段就是執(zhí)行每一個 Project 對應(yīng)的 build.gradle 的配置代碼。
下面相關(guān)的API是關(guān)于配置的回調(diào):
gradle.beforeProject
表示對每一個 project 在執(zhí)行配置代碼之前都會回調(diào)這個方法。
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í)行完對應(yīng)的 build.gradle 的配置代碼,準(zhǔn)備要去生成對應(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í)行階段時機
Gradle 在配置階段中會執(zhí)行每一個 project 的 build.gradle 的配置代碼,并且最終生成每一個 Task 任務(wù)的依賴關(guān)系。下面到了執(zhí)行階段就會根據(jù)這個依賴關(guān)系去執(zhí)行對應(yīng)的 Task 任務(wù)。
gradle.taskGraph.beforeTask
每一個 Task 任務(wù)執(zhí)行之前回調(diào)
gradle.taskGraph.beforeTask { Task task -> println "Project[${task.project.name}]--->Task[${task.name}] 在執(zhí)行之前被回調(diào)" }
gradle.taskGraph.afterTask
每一個 task 執(zhí)行之后被回調(diào)
gradle.taskGraph.afterTask { task, TaskState taskState -> //第二個參數(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)建完畢" }
計算 build 任務(wù)的執(zhí)行時長
在 Android 中 build 的執(zhí)行是最為復(fù)雜,也是執(zhí)行時間最久的一個 Task ,因為 build 這個任務(wù)依賴了很多其他的任務(wù),第一個被依賴的任務(wù)是 preBuild ,因此我們希望在 preBuild 執(zhí)行之前記錄當(dāng)前的時間戳taskStartTime,在 build 執(zhí)行完畢之后記錄當(dāng)前的時間戳taskEndTime,然后計算兩個時間戳的差值即是 build 任務(wù)的執(zhí)行時長啦。
下面是具體的步驟:
- 通過 project(":app") 對 app module 單獨配置。
- 通過 project.afterEvaluate 監(jiān)聽 project 配置完畢。
- 通過 getBuildTask 獲取 preBuild 和 build 兩個任務(wù)對象。
- 監(jiān)聽 preBuild.doFirst 得到開始執(zhí)行的時間戳。
- 監(jiān)聽 build.doLast 得到執(zhí)行完畢的時間戳。
- 最后得到兩個時間戳的差值即是該任務(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 中追加一個監(jiān)聽獲取在preBuild執(zhí)行之前的時間戳的 action preBuildTask.doFirst { taskStartTime = System.currentTimeMillis() } //在build task 中追加一個監(jiān)聽獲取執(zhí)行完畢的時間戳的 action buildTask.doLast { taskEndTime = System.currentTimeMillis() println "build task 執(zhí)行時間:${taskEndTime - taskStartTime}" } } } /** * 獲取該project對應(yīng)的build任務(wù) * @param project * @return */ Task getBuildTask(Project project, String taskPath) { //獲取該project管理task的容器 TaskContainer taskContainer = project.getTasks() //拿到build的Task對象 Task buildTask = taskContainer.getByPath(taskPath) return buildTask }
執(zhí)行build任務(wù)
./gradlew build
以上就是詳解Gradle構(gòu)建過程的詳細內(nèi)容,更多關(guān)于Gradle構(gòu)建過程的資料請關(guān)注腳本之家其它相關(guān)文章!
- 新手必看Android Studio入門詳解
- 如果你在Android Studio碰到gradle的各種問題就來看這篇文章吧(強烈建議收藏)
- Android Studio 2020新版本卡在Gradle downloading/sync failed/下載緩慢/下載超時的問題
- AndroidStudio 使用過程中出現(xiàn)的異常(Gradle sync failed)處理辦法
- Gradle的基本使用
- 解決IDEA Gradle構(gòu)建報錯''Cause: zip END header not found''
- Java Gradle項目中的資源正確獲取方式
- 關(guān)于Android多渠道打包問題看這一篇就夠了
相關(guān)文章
Android RecyclerView加載不同布局簡單實現(xiàn)
這篇文章主要為大家詳細介紹了Android RecyclerView加載不同布局簡單實現(xiàn),感興趣的小伙伴們可以參考一下2016-08-08Android Studio配置(Android Studio4.1為例)
這篇文章主要介紹了Android Studio配置(Android Studio4.1為例),文中通過圖文介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10詳解Android中實現(xiàn)ListView左右滑動刪除條目的方法
這篇文章主要介紹了Android中實現(xiàn)ListView左右滑動刪除條目的方法,文中分別展示了通過Scroller和NineOldAndroids來實現(xiàn)的例子,需要的朋友可以參考下2016-04-04Android ViewModel與Lifecycles和LiveData組件用法詳細講解
JetPack是一個開發(fā)組件工具集,他的主要目的是幫助我們編寫出更加簡潔的代碼,并簡化我們的開發(fā)過程。JetPack中的組件有一個特點,它們大部分不依賴于任何Android系統(tǒng)版本,這意味者這些組件通常是定義在AndroidX庫當(dāng)中的,并且擁有非常好的向下兼容性2023-01-01Android檢查手機網(wǎng)絡(luò)狀態(tài)及網(wǎng)絡(luò)類型的方法
這篇文章主要介紹了Android檢查手機網(wǎng)絡(luò)狀態(tài)及網(wǎng)絡(luò)類型的方法,涉及Android檢測手機網(wǎng)絡(luò)狀態(tài)的技巧,需要的朋友可以參考下2015-04-04