Android Gradle學(xué)習(xí)(七):Gradle構(gòu)建生命周期

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)如下圖所示:

測試代碼工程結(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í)(九):一些有用的小技巧

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容