Gradle 進(jìn)行構(gòu)建,都要經(jīng)過3個生命周期階段:
- 初始化階段
- 配置階段
- 執(zhí)行階段
Gradle 提供了很多生命周期監(jiān)聽方法,可以在各個階段 Hook 指定的任務(wù)。
1. Project
Project 提供的生命周期回調(diào)方法有:
//在 Project 進(jìn)行配置前調(diào)用
void beforeEvaluate(Closure closure)
//在 Project 配置結(jié)束后調(diào)用
void afterEvaluate(Closure closure)
beforeEvaluate 必須在父模塊的 build.gradle 對子模塊進(jìn)行配置才能生效,因為在當(dāng)前模塊的 build.gradle 中配置,它自己本身都沒配置好,所以不會監(jiān)聽到。
我們用個例子來驗證下結(jié)果,工程結(jié)構(gòu)如下圖所示:

settings.gradle 代碼:
include ":app"
build.gradle 代碼:
//對子模塊進(jìn)行配置
subprojects { sub ->
sub.beforeEvaluate { proj ->
println "子項目beforeEvaluate回調(diào)..."
}
}
println "根項目配置開始---"
task rootTest {
println "根項目里任務(wù)配置---"
doLast {
println "執(zhí)行根項目任務(wù)..."
}
}
println "根項目配置結(jié)束---"
app/build.gradle 代碼:
println "APP子項目配置開始---"
afterEvaluate {
println "APP子項目afterEvaluate回調(diào)..."
}
task appTest {
println "APP子項目里任務(wù)配置---"
doLast {
println "執(zhí)行子項目任務(wù)..."
}
}
println "APP子項目配置結(jié)束---"
在根目錄執(zhí)行:gradle -q,結(jié)果如下:
根項目配置開始---
根項目里任務(wù)配置---
根項目配置結(jié)束---
子項目beforeEvaluate回調(diào)...
APP子項目配置開始---
APP子項目里任務(wù)配置---
APP子項目配置結(jié)束---
APP子項目afterEvaluate回調(diào)...
2. Gradle
Gradle 提供的生命周期回調(diào)方法很多,部分與 Project 里的功能雷同:
//在project進(jìn)行配置前調(diào)用,child project必須在root project中設(shè)置才會生效,root project必須在settings.gradle中設(shè)置才會生效
void beforeProject(Closure closure)
//在project配置后調(diào)用
afterProject(Closure closure)
//構(gòu)建開始前調(diào)用
void buildStarted(Closure closure)
//構(gòu)建結(jié)束后調(diào)用
void buildFinished(Closure closure)
//所有project配置完成后調(diào)用
void projectsEvaluated(Closure closure)
//當(dāng)settings.gradle中引入的所有project都被創(chuàng)建好后調(diào)用,只在該文件設(shè)置才會生效
void projectsLoaded(Closure closure)
//settings.gradle配置完后調(diào)用,只對settings.gradle設(shè)置生效
void settingsEvaluated(Closure closure)
我們修改 setting.gradle 的代碼如下:
gradle.settingsEvaluated {
println "settings:執(zhí)行settingsEvaluated..."
}
gradle.projectsLoaded {
println "settings:執(zhí)行projectsLoaded..."
}
gradle.projectsEvaluated {
println "settings: 執(zhí)行projectsEvaluated..."
}
gradle.beforeProject { proj ->
println "settings:執(zhí)行${proj.name} beforeProject"
}
gradle.afterProject { proj ->
println "settings:執(zhí)行${proj.name} afterProject"
}
gradle.buildStarted {
println "構(gòu)建開始..."
}
gradle.buildFinished {
println "構(gòu)建結(jié)束..."
}
include ":app"
這個時候的執(zhí)行結(jié)果如下:
settings:執(zhí)行settingsEvaluated...
settings:執(zhí)行projectsLoaded...
settings:執(zhí)行test beforeProject
根項目配置開始---
根項目里任務(wù)配置---
根項目配置結(jié)束---
settings:執(zhí)行test afterProject
settings:執(zhí)行app beforeProject
子項目beforeEvaluate回調(diào)...
APP子項目配置開始---
APP子項目里任務(wù)配置---
APP子項目配置結(jié)束---
settings:執(zhí)行app afterProject
APP子項目afterEvaluate回調(diào)...
settings: 執(zhí)行projectsEvaluated...
構(gòu)建結(jié)束...
可以看到 gradle.beforeProject 與 project.beforeEvaluate 是類似的,同樣 afterProject 與 afterEvaluate 也是類似的。
除此之外,Gradle 還有一個通用的設(shè)置生命周期監(jiān)聽器的方法:addListener

上面的 BuildListener、ProjectEvaluationListener 等與前面的部分 API 功能是一致的,這里不再贅述了。
3. TaskExecutionGraph(Task執(zhí)行圖)
Gradle 在配置完成后,會對所有的 task 生成一個有向無環(huán)圖,這里叫做 task 執(zhí)行圖,他們決定了 task 的執(zhí)行順序等。同樣,Gradle 可以對 task 的執(zhí)行生命周期進(jìn)行監(jiān)聽。
//任務(wù)執(zhí)行前掉用
void afterTask(Closure closure)
//任務(wù)執(zhí)行后調(diào)用
void beforeTask(Closure closure)
//任務(wù)準(zhǔn)備好后調(diào)用
void whenReady(Closure closure)
通過 gradle.getTaskGraph() 方法來獲取 task 執(zhí)行圖:
TaskExecutionGraph taskGraph = gradle.getTaskGraph()
taskGraph.whenReady {
println "task whenReady"
}
taskGraph.beforeTask { Task task ->
println "任務(wù)名稱:${task.name} beforeTask"
}
taskGraph.afterTask { Task task ->
println "任務(wù)名稱:${task.name} afterTask"
}
4. 小結(jié)
生命周期回調(diào)的執(zhí)行順序:
gradle.settingsEvaluated->
gradle.projectsLoaded->
gradle.beforeProject->
project.beforeEvaluate->
gradle.afterProject->
project.afterEvaluate->
gradle.projectsEvaluated->
gradle.taskGraph.graphPopulated->
gradle.taskGraph.whenReady->
gradle.buildFinished
系列文章
Android Gradle學(xué)習(xí)(一):Gradle基礎(chǔ)入門
Android Gradle學(xué)習(xí)(二):如何創(chuàng)建Task
Android Gradle學(xué)習(xí)(三):Task進(jìn)階學(xué)習(xí)
Android Gradle學(xué)習(xí)(四):Project詳解
Android Gradle學(xué)習(xí)(五):Extension詳解
Android Gradle學(xué)習(xí)(六):NamedDomainObjectContainer詳解
Android Gradle學(xué)習(xí)(七):Gradle構(gòu)建生命周期
Android Gradle學(xué)習(xí)(八):統(tǒng)計Task執(zhí)行時長
Android Gradle學(xué)習(xí)(九):一些有用的小技巧