再探Gradle

2,186 阅读4分钟

首先通过文章我们将能学习到什么?

总结

  1. 首先要了解gradle是什么,能做什么(一定要从编程框架的角度去了解)
  2. 了解gradle和maven、ant之间的区别以及它的优势
  3. 了解gradle的生命周期

下面根据总结的内容开始讲述

gradle的基本概念

Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。
Gradle不仅仅是一个工具,拥有自己的groovy语法,更拥有gradle api,此时不就更是一个编程框架的体现了嘛?
我们通过下图来了解下gradle的基本组成部分

所以,学好groovy语法是学好gradle的核心。

gradle的优势

  1. 灵活性
    Maven、Ant构建程序的时候无法修改构建的过程,也就是工具给我们提供了什么,我们就只能用什么,但是Gradle不一样,以Android开发为例,我们在建构apk包的时候,可以通过构建gradle脚本在程序编译执行的时候修改apk的包名,但是Maven或者Ant只能在构建完成后才可以进行修改操作。
  2. 粒度性
    在使用Maven或者是Ant构建程序的时候,源代码和脚本是独立的,而且我们也不知道工具内部做了什么,就打包生成了apk。
    但是gradle就不同了,gradle资源的编译、源代码的编译到生成apk,都是通过执行一个个Task任务生成的(且这些Task内部源码都是开源的,如果想了解Gradle的执行过程的话,是可以通过查看Task源码来进行学习的),最后打包生成apk的所有逻辑,而且整个生成的过程都是可以通过改变Task任务动态改变的,Tinker就是如此。
  3. 扩展性
    Gradle支持插件机制,可以直接复用已有的插件。
  4. 兼容性
    Gradle不仅仅拥有自己优势,并且还集成了Maven和Ant的功能,吸取了所有的构建工具的长处

总结:gralde相比于其他工具有非常多的优势,最核心的原因是因为Gradle是一个编程框架,当然要比xml配置要强大的多

gradle执行流程(生命周期)

1、生命周期的介绍
首先我们来看一个命令的执行过程,以mac系统为例

./gradlew clean

./gradlew build

执行过程分析:
1、首先短暂的Loading阶段
2、然后执行一段时间的Configuring阶段
3、执行完Configuring后再真正执行clean或者build操作

今日问答

Q1:在执行的时候,为什么会有前面两步操作?
A1:loading和configuring其实就是gradle生命周期中的前两个

Q2:为什么执行build操作的时候又执行了很多其他的命令
A2:在执行clean或者是build操作的时候,其实就是在执行gradle中的Task任务,而Task之间有依赖性,所以必须将其他依赖的Task的任务先执行完成再执行自身的Task,所以我们在控制台就会看到很大一堆的命令输出了

下面我们用一张图来理解上面的执行的过程

1、Loding阶段也就是初始化阶段(Initialization),也就是执行项目中的setting.gradle文件,解析该项目中的所有module,并构建出对应的project对象。

2、onfiguring就是配置阶段(Configration),该阶段就是解析每个module中的build.gradle文件中的配置信息,在①和②执行的过程中我们可以添加一个Hook,当然这个是通过API来进行操作的。

3、最后就是执行阶段,上面的两步是第三步执行的前提条件,也就是执行我们最终的clean、build命令操作。你在gradle命令中指定的Task任务,gradle就会将这个Task任务链上的所有任务全部按依赖顺序执行一遍。

现在我们最后来总结下为什么在build的任务的时候会输出很多东西,见下图

如图所见,我们执行build任务的时候,首先依赖了check和assemble任务,而他们又依赖了其他的任务,所以最终在控制台看到的时候就输出了一大堆的东西

2、生命周期监听
常见的监听方法

//常见的一组 
/**
*配置阶段开始前的监听回调
**/
this.beforeEvaluate {
     println '配置阶段执行开始执行'
}
/**
*配置阶段完成后的监听回调
**/
this.afterEvaluate {
   println '配置阶段执行完成'
}
/**
*gradle执行完成后的回调监听
**/
this.gradle.buildFinished {
     println '执行阶段执行完成'
}

//另外一组
this.gradle.beforeProject {}
this.gradle.afterProject {}
this.gradle.buildFinished {}

//另外一组
this.gradle.addListener()
this.gradle.addBuildListener()
this.gradle.addProjectEvaluationListener()

当前,我们之前提到了初始化的过程,那个我们也可以在setting.gradle文件中添加如下打印语句

println '初始化阶段开始执行'

通过添加上面的代码后,我们执行

./gradlew clean

得到结果

常用的监听方式就是使用第一种方式,在此我们了解生命周期是很有必要的,正如我们学习Activity的时候需要了解它的生命周期一样,顺便问一句,你们还记得Activity的生命周期流程吗?