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,就可以完成对整个编译过程的监听,代码如下所示。

  1. gradle.addListener new LifecycleListener()
  2.  
  3. class LifecycleListener implements TaskExecutionListener, BuildListener {
  4.  
  5. private Clock clock
  6. private execution = []
  7.  
  8. @Override
  9. void beforeExecute(Task task) {
  10. clock = new Clock()
  11. }
  12.  
  13. @Override
  14. void afterExecute(Task task, TaskState taskState) {
  15. def ms = clock.timeInMs
  16. execution.add([ms, task.path])
  17. println "Task: ${task.path} took ${ms}ms"
  18. }
  19.  
  20. @Override
  21. void buildFinished(BuildResult result) {
  22. println "Task Execute Time:"
  23. for (time in execution) {
  24. printf "%7sms %s\n", time
  25. }
  26. }
  27.  
  28. @Override
  29. void buildStarted(Gradle gradle) {
  30. }
  31.  
  32. @Override
  33. void projectsEvaluated(Gradle gradle) {
  34. }
  35.  
  36. @Override
  37. void projectsLoaded(Gradle gradle) {
  38. }
  39.  
  40. @Override
  41. void settingsEvaluated(Settings settings) {
  42. }
  43. }

在上面的代码中,笔者监听了buildFinished和afterExecute两个事件,打印出Task的耗时,结果如图4.49所示。

Gradle生命周期 - 图1 图4.49 Task耗时

这就是Gradle生命周期监听的一个应用,可以用来分析编译的时间,找出耗时的Task进行优化。