gradle 插件以及执行过程解析
在 Android Studio 中,项目都是使用 Gradle 来构建的,那么我们通常使用的 Gradle 插件是如何执行的呢?
Gradle 的执行步骤
简单说 gradle 是一种构建工具,用来控制代码的编译、构建、打包等过程,有点像 C/C++ 项目中的 Make 工具。gradle 执行一次 build 总共可以分为三个步骤:
1. 初始化阶段
读取根工程中 setting.gradle 中的 include 信息,确定当前项目中哪几个工程加入构建,创建 project 实例。
例如:
include ':app', ':moudle1', ':moudle2'
Gradle 构建时会去读取根工程中 setting.gradle 中的 include 信息,决定有哪几个工程加入构建,创建 project 实例,例如示例中有3个工程参与了构建。
2. 配置阶段
执行项目中的 build.gradle 脚本文件,配置 project 对象,一个对象由多个任务组成,此阶段也会去创建、配置 task 及相关信息。
3. 执行阶段
根据 gradle 命令传递过来的 task 名称,执行相关依赖任务。
Gradle 插件的使用方法
Gradle 的插件一般有以下使用方式:
- 直接在项目中的 gradle 文件里编写,这种方式的缺点是无法复用插件代码,在其他项目中还得复制一遍代码。
- 在独立的项目里编写插件,然后发布到中央仓库,之后直接引用就可以了,优点就是可复用。
project 和 tasks
我们再来看两个重要的概念:project 和 tasks。
在 grade 中的两大重要的概念,分别是 project 和 tasks。每一次构建都是有至少一个 project 来完成,注意,这里的 project 和 Android studio 中的 project 不是一个概念。每个 project 有至少一个 tasks。每一个 build.grade 文件代表着一个 project。tasks 在 build.gradle 中定义。当初始化构建进程,gradle 会基于 build 文件,集合所有的 project 和 tasks,一个 tasks 包含了一系列动作,然后它们将会按照顺序执行,一个动作就是一段被执行的代码,这有点类似与方法的概念。
Task
gradle 的工作都由一个个 Task 来执行。Task 可以指定它所依赖的 Task,或者它要在另一个 Task 之前或者之后运行。
将处理逻辑分在不同的 Task 中有这么两个好处:
- 业务解耦,有利于维护和提高代码健壮性。
- 增量编译,当 Task 的输入/输出没有变化时,不用再次运行,直接复用。
创建 Task 常见的方式有两种:
- 在 build.gradle 中直接创建。
- 通过插件创建。
build.gradle 中一般创建功能简单的 Task,逻辑复杂的 Task 通常由插件创建,否则会使得 build.gradle 文件臃肿不堪。可见插件也是 gradle 一个重要组成部分,我们再来看看插件是做什么的。
插件
gradle 核心的逻辑比较简单,丰富的构建功能都是通过插件的方式扩展的。比如 Android 的构建逻辑肯定不是 gradle 官方代码自带的,而是 Android 写了对应的 gradle 插件来实现。这个特性保证了 gradle 功能的灵活性。
在 Android 中,最常见的两个插件分别是:
- com.android.application
- com.android.library
那么插件如何使用呢?它通常在 build.gradle 文件中来使用的:
apply plugin: 'com.android.application'
这表示所在的 module 是一个 app module,而使用 com.android.library 插件表示所在 module 是一个 library module,两种插件分别会对该 module 做不同的配置。
好了,gradle 以及 gradle 插件主要的理论知识我们已经了解了,下一章我们来分析它在 Android studio 中的使用。