最近在做Gradle知识整理,想做成一个系列,以此加深对Gradle的理解。
Gradle构建的生命周期可以分为三个阶段:初始化,配置,执行。下面将详细介绍各个阶段的工作。
初始化阶段
初始化阶段的工作主要是:初始化settings.gradle文件,获取setting实例。执行setting中的脚本,根据include字段,创建对应的project实例。设置构建需要的环境。
以下是初始化阶段提供的回调:
在setting.gradle文件下添加以下代码:
gradle.settingsEvaluated {
println '【settings.gradle脚本执行完毕】'
}
gradle.projectsLoaded {
println '【初始化阶段结束】'
}
build结果如下:
配置阶段
配置阶段主要的工作是:下载所有插件和构建脚本依赖。执行build.gradle文件中的脚本信息。实现task任务的拓扑图,这个图是一个有向无环图,防止任务执行进入死循环。
在setting.gradle文件下添加以下代码:
gradle.settingsEvaluated {
println '【settings.gradle脚本执行完毕】'
}
gradle.projectsLoaded {
println '【初始化阶段结束】'
}
gradle.beforeProject { project ->
println "<gradle.beforeProject> ${project.name}配置前"
}
gradle.afterProject { project ->
println "<gradle.afterProject> ${project.name}配置完成"
}
gradle.projectsEvaluated {
println '【配置阶段结束】'
}
gradle.taskGraph.whenReady {
println 'task 拓扑图构造完毕'
}
在app目录下的build.gradle文件下添加以下代码:
project.afterEvaluate { project ->
println "<project.afterEvaluate> ${project.name}配置完成"
}
task task1{
println "<task1> 配置task1"
}
build结果如下:
从build打印的内容可以知道:每个Project在配置阶段都调了一次beforeProject和afterProject,所有的Project都配置完成后会调用projectsEvaluated,Task拓扑图构造完成后会调用taskGraph.whenReady。
除此之外,我们还能监听任务的添加操作。在app目录下的build.gradle文件下添加以下代码:
tasks.whenTaskAdded { task ->
println "${project.name}添加task:${task.name}"
}
// 我们可以监听这个回调来配置一些任务依赖或修改某些变量
def preBuild = this.tasks.findByName('preBuild')
project.tasks.whenTaskAdded { task ->
if (task.name == 'task1') {
preBuild.dependsOn(task) // 执行preBuild之前会执行task
}
}
部分build结果如下:
执行阶段
根据配置阶段生成的任务拓扑图执行任务。
在setting.gradle文件下添加以下代码:
gradle.taskGraph.beforeTask { task ->
println "<beforeTask> ${task.name}执行前"
}
gradle.taskGraph.afterTask { task ->
println "<afterTask> ${task.name}执行后"
}
gradle.buildFinished {
println '【构建过程结束】'
}
build结果如下:
中间省略部分task执行过程。。。