全面理解Gradle - 执行时序

Posted 玉刚说

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全面理解Gradle - 执行时序相关的知识,希望对你有一定的参考价值。

什么是Gradle?

一个像 Ant 一样的非常灵活的通用构建工具 
一种可切换的, 像 maven 一样的基于合约构建的框架 
支持强大的多工程构建 
支持强大的依赖管理(基于 ApacheIvy ) 
支持已有的 maven 和 ivy 仓库 
支持传递性依赖管理, 而不需要远程仓库或者 pom.xml 或者 ivy 配置文件 
优先支持 Ant 式的任务和构建 
基于 groovy 的构建脚本 
有丰富的领域模型来描述你的构建

如何学习Gradle?

  • 学习 Groovy(http://docs.groovy-lang.org/)

  • 学习 Gradle DSL(https://docs.gradle.org/current/javadoc/org/gradle/api/Project.html

  • 学习 android DSL和Task(http://google.github.io/android-gradle-dsl/current/index.html)

使用Gradle wrapper

如果你本地安装了Gradle,那么你就可以使用gradle命令来直接构建。如果本地没有安装,那么可以通过gradle wrapper来构建,Linux和MAC使用./gradlew,而Windows上面则使用gradlew,还可以在 gradle/gradle-wrapper.properties 中配置 Gradle 版本。

Gradle脚本的执行时序

Gradle脚本的执行分为三个过程:

  • 初始化 
    分析有哪些module将要被构建,为每个module创建对应的 project实例。这个时候settings.gradle文件会被解析。

  • 配置:处理所有的模块的 build 脚本,处理依赖,属性等。这个时候每个模块的build.gradle文件会被解析并配置,这个时候会构建整个task的链表(这里的链表仅仅指存在依赖关系的task的集合,不是数据结构的链表)。

  • 执行:根据task链表来执行某一个特定的task,这个task所依赖的其他task都将会被提前执行。

我们以它的宿主端为例,宿主端有如下几个模块: 
 
其中buildSrc是virtualapk-gradle-plugin,为了便于调试我将其重命名为buildSrc。他们的依赖关系如下:

全面理解Gradle - 执行时序

解释一下,app模块依赖CoreLibrary和buildSrc,CoreLibrary又依赖AndroidStub。为了大家更好理解,下面加一下log。

全面理解Gradle - 执行时序


全面理解Gradle - 执行时序


全面理解Gradle - 执行时序



现在随便执行一个task,比如./gradlew clean,那么将会输出如下日志,大家对比着日志,应该能明白Gradle脚本的执行顺序了吧。


可以看到,Gradle执行的时候遵循如下顺序: 
1. 首先解析settings.gradle来获取模块信息,这是初始化阶段; 
2. 然后配置每个模块,配置的时候并不会执行task; 
3. 配置完了以后,有一个重要的回调project.afterEvaluate,它表示所有的模块都已经配置完了,可以准备执行task了; 
4. 执行指定的task。

备注:如果注册了多个project.afterEvaluate回调,那么执行顺序等同于注册顺序。在上面的例子中,由于buildSrc中的回调注册较早,所以它也先执行。

我知道,我又好久没更新了,对不住关注我的粉丝们。现在我又发文了,你们是不是很激动呢?阅读我亲手写的文章,字里行间是否还能找到那个熟悉的感觉呢?

我知道,由于苹果政策的原因,一直以来iPhone用户没法给我赞赏,你们可能觉得很难受,没关系,这次我放出我的微信收款二维码,让你们一次赞赏个够!

其实,都是玩笑话,不赞赏我也不会怪你们的,很感谢我的粉丝们,尤其是我的铁杆粉丝们,是你们给了我前进的动力,有你们真好!

以上是关于全面理解Gradle - 执行时序的主要内容,如果未能解决你的问题,请参考以下文章

JAVA生成(可执行)Jar包的全面详解说明 [打包][SpringBoot][Eclipse][IDEA][Maven][Gradle][分离][可执行]

片段内部静态类和gradle问题

Sleep() 方法后的代码片段没有被执行

Gradle 引入本地定制 jar 包

Gradle入门之Groovy元编程

PHP PHP代码执行时序脚本