Gradle是什么
Gradle是一款开源的自动化构建工具,可以灵活的构建任何类型软件(基本上),比如我们日常开发所熟知的:
- Java的产物(.JAR)
- Android Application的产物(.APK)
- Android Library的产物(.AAR)
目前Gradle已经是Android官方首推的自动化构建工具线,也是我们开发当中最密不可分的工具了。它与历史上过去的Java的自动化构建工具(Ant,Maven)相比,主要的优势是:
- 高性能
- 高拓展性
Gradle核心概念
关于Gradle必须知道的几个核心概念:
- Gradle是一款通用的构建工具,它基本上可以用于构建任意类型的软件
Gradle虽然是一款自动构建工具,但它本身并不限定构建方法、构建内容。通过灵活的插件体系,Gradle能提供基于约定的构建能力而无需复杂的配置。 - Gradle的核心构建块是Task
Gradle的构建体系(构建流程)是通过定义task、分析task的依赖关系,构造一张task的有向无环图来完成的。 - Gradle有着固定的编译阶段
Gradle按照下面三个阶段来评估(evaluate)和执行(execute)我们的编译脚本
- 初始化阶段:包括构建环境的初始化,并在这个阶段确定需要参与构建的Project
- 配置阶段:构造task的有向无环图的关系
- 执行阶段:执行所有需要执行的task
- Gradle提供灵活的构建拓展体系
- 自定义task的类型
- 自定义task的行为
- 自定义构建任务的属性
- 自定义约定规则
- 自定义构建块
- Gradle的脚本是基于API运行的
Gradle的配置和执行
生命周期&hook
一张图整体理解Gradle的生命周期和配置执行流程
三种构建脚本
在整个构建体系中,总共有三种类型的构建脚本。同时前面关于Gradle的基础提到,Gradle是基于API执行的,实际上这三种脚本在运行时都对应着不同都对象实例,其关系如下:
- init.gradle -> Gradle实例
- settings.gradle -> Settings实例
- build.gradle -> Project实例
所以实际上我们在对应脚本里面添加的逻辑块实际上都是在调用着对应的实例的API.而且这三个实例构造的先后顺序也跟对应脚本的执行顺序一样。
1. Init script
这个脚本通常我们很少接触到,实际上这个脚本才是Gradle构建的起点。通常我们可以使用这个脚本来统一设定所有编译任务共享的一些逻辑或者是前置的初始化逻辑。
它的配置跟我们常用的build.gradle配置相似,只是由于它对应的是Gradle的实例,对应的配置逻辑都是调用Gradle的API。简单配置如下所示:
initscript{
// 我们可以使用initscript配置块来添加这个脚本运行需要的一些依赖
// 这个配置块是这个脚本最先被执行的逻辑(与代码放置顺序无关)
repositories{
}
depdendencies{
}
}
// 下面这些都是能通过Gradle实例,添加生命周期hook节点
buildStarted {}
beforeSettings {}
settingsEvaluated {}
beforeProject {}
afterProject {}
projectsLoaded {}
projectsEvaluated {}
buildFinished {}
taskGraph.whenReady {}
如果我们需要使用
init.gradle
可以在执行构建命令的时候通过--init-script
参数来制定对应的文件路径
2. Settings script
这个是我们平常接触到比较多的一个脚本。这个脚本执行在初始化阶段会被执行,确定需要参与构建的流程的project。(所以我们关于多模块编译或者多仓编译的配置就在这个里面)
rootProject.name = "gradle-test"
include("subProject")
includeBuild("path/to/other/project")
3. Build script
我们接触最多的配置脚本。每一个使用Gradle进行构建的工程或者模块根目录下都会有一个build.gradle
,同时对应着一个project的实例。
buildscript {
// 我们可以使用buildscript配置块来添加这个脚本运行需要的一些依赖
// 这个配置块是这个脚本最先被执行的逻辑(与代码放置顺序无关)
repositories {
}
dependencies {
}
}
plugins {
kotlin("jvm")
}
// 下面的repositories和dependencies定义的是project构建所需要的依赖。注意跟buildscript配置块里面的逻辑区分
repositories {
mavenCentral()
}
dependencies {
implementation(kotlin("stdlib"))
}
三个构建块
1. Project
2. Task
3. Properties
从属性读取方式看的话,可以将属性分为以下两种:
- System Properties
通过Sytem.getProperty()
的方式读取,部分org.gradle.xxx
打头的配置是由设置给运行gradle的jvm使用的。 - Project Properties
通过Project.getProperty()的方式读取
上面两种属性内容的传递方式主要有以下两种:
- 通过命令行定义
- 传递系统属性:使用-D.比如
-DsystemKey=systemValue
- 传递项目属性:使用-P或者-Dorg.gradle.project.XXX.比如
-PprojectKey=projectValue
,-Dorg.gradle.project.projectKey=projectValue
- 通过gradle.properties定义
// garadle.properties
projectKey=projectValue // 定义项目属性
systemProp.systemKey=systemValue // 定义系统属性
Note:项目属性(Project Properties)还能通过ext配置块来定义
Note:Gradle中的属性是可继承的,意思是指在在父project中定义的属性,在子project中也能直接使用