|
Gradle进行构建,都经过3个生命周期阶段:
Gradle提供了很多生命周期监听方法,可以在各阶段Hook指定的任务;
1.Project
Project提供的生命周期回调方法有
//在Project进行配置前调用
void beforeEvaluate(Closure var1);
//在Project配置结束后调用
void afterEvaluate(Closure var1);
beforeEvaluate必须在父模块的build.gradle对子模块进行配置才能生效,因为在当前模块的build.gradle中配置,它自己本身都没配置好,所以不会监听到;
我们用个例子来验证下结果,工程结构如下图所示:

?setting.gradle代码:
include ':app'
rootProject.name = "FloatWindowL"
FloatWindowL/build.gradle代码:
//对子模块进行配置
subprojects { sub ->
sub.beforeEvaluate { project ->
println "${project.name}子项目beforeEvaluate回调..."
}
}
println "根项目配置开始---"
task rootTest {
println "根项目里任务配置---"
doLast {
println "执行根项目任务..."
}
}
println "根项目配置结束---"
FloatWindowL/app/build.gradle代码:
println "APP sub project config start---"
afterEvaluate {
println "APP sub project afterEvaluate callback..."
}
task appTest {
println "APP sub project task config---"
doLast {
println "execution sub project task..."
}
}
println "APP sub project config end---"
在根目录执行:gradle -q,结果如下:
C:\xxxx\FloatWindowL>gradle -q 根项目配置开始--- 根项目里任务配置--- 根项目配置结束--- app子项目beforeEvaluate回调... APP sub project config start--- APP sub project task config--- APP sub project config end--- APP sub project afterEvaluate callback... ?
2.Gradle
Gradle提供的生命周期回调方法很多,部分与Project里的功能类似:
//在project进行配置前调用,child project必须在root project中设置才会生效,root project必须在settings.gradle中设置才会生效
void beforeProject(Closure closure)
//在project配置后调用
afterProject(Closure closure)
//构建开始前调用
void buildStarted(Closure closure)
//构建结束后调用
void buildFinished(Closure closure)
//所有project配置完成后调用
void projectsEvaluated(Closure closure)
//当settings.gradle中引入的所有project都被创建好后调用,只在该文件设置才会生效
void projectsLoaded(Closure closure)
//settings.gradle配置完后调用,只对settings.gradle设置生效
void settingsEvaluated(Closure closure)
我们修改gradle的代码如下:
include ':app'
rootProject.name = "FloatWindowL"
//在初始化前就已经调用了buildStarted方法,所以在初始化阶段无法回调到
gradle.buildStarted {
println('init Before bulidStarted......')
}
//1.初始化阶段
gradle.settingsEvaluated {
println('init settingsEvaluated')
}
gradle.projectsLoaded {
println('init projectsLoaded')
}
//2.配置阶段
gradle.beforeProject {project ->
????????println "${project.name} config beforeProject --- in settings.gradle"
}
gradle.afterProject{ project ->
println "${project.name} config afterProject"
}
gradle.projectsEvaluated {
println 'config projectsEvaluated'
}
// 4.build结束
gradle.buildFinished {
println 'buildEnd buildFinished'
}
这个时候的执行结果如下:
init settingsEvaluated init projectsLoaded FloatWindowL config beforeProject --- in settings.gradle 根项目配置开始--- 根项目里任务配置--- 根项目配置结束--- FloatWindowL config afterProject app config beforeProject --- in settings.gradle app子项目beforeEvaluate回调... APP sub project config start--- APP sub project task config--- APP sub project config end--- app config afterProject APP sub project afterEvaluate callback... config projectsEvaluated buildEnd buildFinished
可以看到 gradle.beforeProject 与 project.beforeEvaluate 是类似的,同样 afterProject 与 afterEvaluate 也是类似的。
除此之外,Gradle 还有一个通用的设置生命周期监听器的方法:addListener

?上面的 BuildListener、ProjectEvaluationListener 等与前面的部分 API 功能是一致的,这里不再赘述了。
3. TaskExecutionGraph(Task执行图)
Gradle 在配置完成后,会对所有的 task 生成一个有向无环图,这里叫做 task 执行图,他们决定了 task 的执行顺序等。同样,Gradle 可以对 task 的执行生命周期进行监听。
//任务执行前掉用
void afterTask(Closure closure)
//任务执行后调用
void beforeTask(Closure closure)
//任务准备好后调用
void whenReady(Closure closure)
通过 gradle.getTaskGraph() 方法来获取 task 执行图:
FloatWindowL/app/bulid.gradle
// 3.执行阶段
TaskExecutionGraph taskGraph = gradle.getTaskGraph()
taskGraph.whenReady {
println "task whenReady"
}
taskGraph.beforeTask { Task task ->
println "task name:${task.name} beforeTask"
}
taskGraph.afterTask { Task task ->
println "task name:${task.name} afterTask"
}
4. 小结
生命周期回调的执行顺序(粗体为生命周期方法):
C:\XXX\FloatWindowL>gradle -q init settingsEvaluated init projectsLoaded FloatWindowL config beforeProject --- in settings.gradle 根项目配置开始--- 根项目里任务配置--- 根项目配置结束--- FloatWindowL config afterProject app config beforeProject --- in settings.gradle app子项目beforeEvaluate回调... APP sub project config start--- APP sub project task config--- APP sub project config end--- app config afterProject APP sub project afterEvaluate callback... config projectsEvaluated task whenReady task name:help beforeTask
Welcome to Gradle 6.5.
To run a build, run gradle <task> ...
To see a list of available tasks, run gradle tasks
To see a list of command-line options, run gradle --help
To see more detail about a task, run gradle help --task <task>
For troubleshooting, visit https://help.gradle.org task name:help afterTask buildEnd buildFinished ?
Gradle构建周期的Hook点

参考:
Android Gradle学习(七):Gradle构建生命周期 - 简书
Gradle生命周期_威威的专栏-CSDN博客
Gradle | 进阶篇(Project & Task & 构建生命周期)| 七日打卡 - 掘金
|