Gradle生命周期
Gradle在编译项目时有着它自己的生命周期,从编译开始到编译完毕Gralde一共要经历三个阶段。
- Initiliazation
Initiliazation初始化阶段,顾名思义就是执行Gradle的初始化配置选项,即执行项目中的settings.gradle脚本。
- Configration
Configration阶段是解析每个Project中的build.gradle脚本,即解析所有Project中的编译选项。解析完毕后,Gradle就生成了一张有向关系图——taskgraph,这里面包含了整个Task的依赖关系。
- Build
Build阶段是最后的编译运行阶段,即按照taskgraph执行编译。
这三个阶段是宏观把握Gradle的核心所在,你运行任何Gradle指令都会经过这样三个阶段。这也是为什么笔者在前面卖了个关子,没有讲解为什么默认的输出会在doFirst、doLast这些Action前面的原因。
默认的输出是在配置阶段,这时候Gradle会执行所有Task的配置脚本,即使你执行一个指定的Task,也只有到Build阶段,才能够开始执行。
Gradle生命周期的监听
Gradle的整个编译过程都是可控的,它给开发者提供了监听整个生命周期的方法——gradle.addListener。通过实现TaskExecutionListener和BuildListener,就可以完成对整个编译过程的监听,代码如下所示。
- gradle.addListener new LifecycleListener()
- class LifecycleListener implements TaskExecutionListener, BuildListener {
- private Clock clock
- private execution = []
- @Override
- void beforeExecute(Task task) {
- clock = new Clock()
- }
- @Override
- void afterExecute(Task task, TaskState taskState) {
- def ms = clock.timeInMs
- execution.add([ms, task.path])
- println "Task: ${task.path} took ${ms}ms"
- }
- @Override
- void buildFinished(BuildResult result) {
- println "Task Execute Time:"
- for (time in execution) {
- printf "%7sms %s\n", time
- }
- }
- @Override
- void buildStarted(Gradle gradle) {
- }
- @Override
- void projectsEvaluated(Gradle gradle) {
- }
- @Override
- void projectsLoaded(Gradle gradle) {
- }
- @Override
- void settingsEvaluated(Settings settings) {
- }
- }
在上面的代码中,笔者监听了buildFinished和afterExecute两个事件,打印出Task的耗时,结果如图4.49所示。
图4.49 Task耗时
这就是Gradle生命周期监听的一个应用,可以用来分析编译的时间,找出耗时的Task进行优化。
