两个重要概念
项目(Project)通常代表的是构建内容。Gradle 构建就是由一个或多个项目组成的。
任务(Task)是在构建阶段被执行的操作,是 Gradle 构建的原子工作单位,在项目的构建脚本中定义,并且可以彼此依赖。
每个项目的编译至少有一个 Project,每个 Project 里面包含了多个 Task,Task 里面又包含很多 Action 代码块,里面包含了需要被执行的代码。
生命周期
初始化阶段:初始化阶段的任务是创建项目的层次结构,并且为每一个项目创建一个Project实例。
与初始化阶段相关的脚本文件是settings.gradle(包括<USER_HOME>/.gradle/init.d目录下的所有.gradle脚本文件,这些文件作用于本机的所有构建过程)。
配置阶段:配置阶段的任务是执行各项目下的build.gradle脚本,完成Project的配置,并且构造Task任务依赖关系图以便在执行阶段按照依赖关系执行Task。
每个build.gralde脚本文件对应一个Project对象,在初始化阶段创建。配置阶段执行的代码包括build.gralde中的各种语句、闭包以及Task中的配置段语句。
在配置阶段结束后,Gradle会根据任务Task的依赖关系创建一个有向无环图。
执行阶段:通过Gradle对象的getTaskGraph方法访问,对应的类为TaskExecutionGraph,然后通过调用gradle <任务名>执行对应任务。
生命周期监听方法执行顺序:
方法 | 说明 |
---|---|
gradle.settingsEvaluated | 当 settings.gradle 加载并配置完毕后执行闭包回调,setting对象已经配置好并且准备开始加载构建 project。这个回调在 build.gradle 中声明也是不起作用的,在 settings.gradle 中声明是可以的。 |
gradle.projectsLoaded | 当 setting 中的所有project 都创建好时执行闭包回调。gradle 对象会作为参数传递给闭包。如果将这个声明周期挂接闭包声明在 build.gradle 文件中,那么将不会发生这个事件,因为项目创建发生在初始化阶段。放在 settings.gradle 中是可以执行的。 |
gradle.beforeProject | project 配置前执行的闭包或者回调方法,当前 project 作为参数传递给闭包。 |
project.beforeEvaluate | 在 project 开始配置前调用,当前的 project 作为参数传递给闭包。 |
gradle.afterProject | project 配置完毕后立即执行的闭包或者回调方法。在配置参数失败后会传入两个参数,前者是当前 project,后者显示失败信息。 |
project.afterEvaluate | 只要 project 配置成功均会调用,不论是在父模块还是子模块。 |
gradle.projectsEvaluated | 所有的 project 都配置完成后的回调,此时,所有的project都已经配置完毕,准备开始生成 task 图。gradle 对象会作为参数传递给闭包。 |
gradle.taskGraph.graphPopulated | addTaskExecutionGraphListener 添加 task 执行图的监听器,当执行图配置好会执行通知。 |
gradle.taskGraph.whenReady | 设置一个 task 执行图准备好后的闭包或者回调方法。该 taskGrahp 作为参数传递给闭包。 |
gradle.buildFinished | 构建结束时的回调,此时所有的任务都已经执行,一个构建结果的对象 BuildResult 作为参数传递给闭包。 |
自定义任务(Task)
Gradle支持两种类型的任务:
简单任务:是 DefaultTask 的一个实例,本身不具备任何功能,需在任务中添加代码。
增强任务:本身具备可在脚本中配置的功能(例如 Copy 任务)。
在脚本中定义task:
task customTask() {
println 'customTask'
doFirst {
println 'doFirst'
}
doLast {
println 'doLast'
}
}
在配置阶段,会输出 customTask ;在执行阶段会输出 doFirst doLast。
继承DefaultTask:
class CustomTask extends DefaultTask {
}