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

根據(jù)在上圖中所示,Gradle 的構(gòu)建過(guò)程主要分為三個(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)
通過(guò) 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í)長(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)聽 project 配置完畢。
- 通過(guò) getBuildTask 獲取 preBuild 和 build 兩個(gè)任務(wù)對(duì)象。
- 監(jiān)聽 preBuild.doFirst 得到開始執(zhí)行的時(shí)間戳。
- 監(jiān)聽 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)聽獲取在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)建過(guò)程的詳細(xì)內(nèi)容,更多關(guān)于Gradle構(gòu)建過(guò)程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 新手必看Android Studio入門詳解
- 如果你在Android Studio碰到gradle的各種問(wèn)題就來(lái)看這篇文章吧(強(qiáng)烈建議收藏)
- Android Studio 2020新版本卡在Gradle downloading/sync failed/下載緩慢/下載超時(shí)的問(wèn)題
- AndroidStudio 使用過(guò)程中出現(xiàn)的異常(Gradle sync failed)處理辦法
- Gradle的基本使用
- 解決IDEA Gradle構(gòu)建報(bào)錯(cuò)''Cause: zip END header not found''
- Java Gradle項(xiàng)目中的資源正確獲取方式
- 關(guān)于Android多渠道打包問(wèn)題看這一篇就夠了
相關(guān)文章
用Kotlin實(shí)現(xiàn)Android點(diǎn)擊事件的方法
本篇文章主要介紹了用Kotlin實(shí)現(xiàn)Android點(diǎn)擊事件的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
Android 通過(guò)SQLite數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)管理
SQLiteOpenHelper 是Android 提供的一個(gè)抽象工具類,負(fù)責(zé)管理數(shù)據(jù)庫(kù)的創(chuàng)建、升級(jí)工作。本文主要介紹了如何使用SQLite數(shù)據(jù)庫(kù)實(shí)現(xiàn)對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)管理,感興趣的可以了解一下2021-11-11
快速解決fragment中onActivityResult不調(diào)用的問(wèn)題
下面小編就為大家?guī)?lái)一篇快速解決fragment中onActivityResult不調(diào)用的問(wèn)題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04
Android中兩個(gè)Activity之間數(shù)據(jù)傳遞及返回問(wèn)題
本篇文章主要介紹了Android中兩個(gè)Activity之間數(shù)據(jù)傳遞及返回問(wèn)題,這里整理了詳細(xì)的代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02
Android多線程+單線程+斷點(diǎn)續(xù)傳+進(jìn)度條顯示下載功能
這篇文章主要介紹了Android多線程+單線程+斷點(diǎn)續(xù)傳+進(jìn)度條顯示下載功能,需要的朋友可以參考下2017-06-06
Android實(shí)現(xiàn)點(diǎn)擊縮略圖放大效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)點(diǎn)擊縮略圖放大效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
Android實(shí)現(xiàn)圖片隨手指旋轉(zhuǎn)功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)圖片隨手指旋轉(zhuǎn)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05

