前言
在前一篇介绍Gradle
的文章中,介绍了一下Gradle
的整体组成以及我们需要的学习方向Android Gradle 知识介绍 (zinyan.com),相对来说比较基础和抽象。
本篇就结合Android Studio
中的build.gradle
文件和右侧的Gradle
面板中的Task
进行一个介绍。让我们更清晰的理解Gradle
落实在Android Studio
中的时候,里面的各种配置含义吧。
能够让大家通过一篇文章,了解Android Studio
中的Gradle
相关知识。
基本流程
Gradle
在构造项目的时候,它的基本流程
- 初始化:调用settings.gradle 获取全部子Project对象。
- 配置加载:解析每个Project对象,并提起该Project对象的任务(Task)
- 执行阶段:Gradle 按照任务进行执行任务链上的所有Task。
- 输出结果:执行完全部任务链,反馈最终的执行结果。
我们在Android Studio
中,也是按照这个流程进行执行的。我们每次点击安装或编译的时候。执行的就是gradle xxx
。然后进行执行任务了。
基本组件
Gradle
是一个构造工具,但是它也是一个框架,它定义了一套自己的执行规则和编译规则。所以我们要了解它在实际使用中是一个怎么样的规则,是如何组成的。
下面就结合Android Studio
中的实际进行一个介绍。
Project
在Gradle
中,每一个要编译的工程命名为Project
。而每一个Project
在构建的时候都包含了一系列的Task
。Gradle
术语中 Build Script
指向的就是每个Project
对象。
例如上面的截图下,Task
是指:androidDependencies
,signingReport
,build
,clean
等等。合起来统称为Tasks
。归属于app
。在Gradle
中app就是一个Project
。
这些Task
,其实就是一个一个的脚本操作。Gradle
会按照编译的规则进行执行相应的Task
。一直到最终的成品输出。
总结:Gradle中的每一个待编译的工程都是一个Project,而一个具体的编译过程是由一个又一个的Task来定义并执行的。
例如我们在编译一个app
的时候,Build
面板中输出的一连串的Task
执行到最后的时候 通常都是有一个 BUILD SUCCESSFUL
,代表编译完毕。
上面就是介绍了 Build
花费了31秒。
一共有84项Task
任务, 其中21项执行了,63项是UP-TO-DATE
最新的,不需要重新编译。下面关于Task
目录下有详细介绍。
在Android Studio中。每一个Library或module都是一个单独的Project对象。
根据Gradle的要求,每一个Project的对象在它的根目录下都需要一个build.gradle文件。而该文件就是该Project对象的编译脚本。
到这里,大家就能理解为什么我们在Android Studio
中创建的Module
都有一个build.gradle
文件了吧。这个文件并不是Google决定的,而是Gradle决定的。
multiprojects
我们如果每个module
都是一个Project
对象,那么多个module
互相依赖的情况下。大家都要执行,那么怎么办?特别是我们创建app
项目的时候,很多Library
库。
针对这种情况Gradle
提供了一个:Multi-Projects Build
(多项目构造组件)。
也就是说在最外层目录下添加一个build.gradle
文件和settings.gradle
文件
也就是我们在Android Studio
中常见的两个配置文件。
- build.gradle:配置其他子
Project
对象,例如为子Project
添加属性,添加全局公用属性等。 - settings.gradle:这个文件告诉
Gradle
,这个multiProjects
中一共包含多少个子Project
。只有在这个里面定义的Project
,Gradle
才能正确识别。
Task
Task
在Gradle
中代表了一些要执行的任务。每一个Task
都需要和Project
进行绑定关联。
我们在Android Studio
中的很多Task
都是系统已经帮我们配置了。通过插件实现的一系列Task
。而这个插件是在build.gradle
文件中定义的。
plugins
下面定义的插件。
什么意思? Task
是任务,但是我们编译一个代码要执行很多很多的任务,例如java代码编译,xml代码编译。kotlin代码编译等。最终编译后进行打包apk,加载签名,输出文件等等。这些任务Task
我们一个一个配置就比较繁琐了。
所以,通常都是通过插件Plugins
,定义好了一连串的Task
任务,我们直接加载Plugins
就可以将要执行的Task
一次性配置到位了。
我们如果自定义Task
要注意:
- 一个Task包含若干Action。所以Task有doFirst 和doLast两个函数,用于添加最先执行的Action,也最后执行的Action。然后这就是一个Task的完整生涯。
更具体的Task
,那估计扩展开来就有一本书了。这里我只是简单概括一下。
我们大部分实际使用场景下,都是通过plugins
加载插件。由这些插件提供的task来达到需求,最多根据我们的实际需求,修改一下相关的插件加载的Task而已。
我们在执行Task过程中, 会有些Task 执行为 UP-TO-DATE
,而有些会执行显示NO-SOURCE
UP-TO-DATE :代表本次编译,没有修改。可以直接使用上次编译的结果。
NO-SOURCE:代表没有数据,也就是说不满足该Task的执行条件。该Task就不会运行了。
如果没有这两个标注的,那么就代表本次编译需要重新执行的Task
了。
很多时候我们提高编译效果。也是优化这方面,减少非必要的Task
来达到我们尽快编译的需求。
对象
我们介绍了,在使用Gradle
进行编译的时候,每个android module
都是一个Project
对象。而相应的gradle
脚本在底层运行过程中,都转换成了java
对象。
那么它的开头是什么?有哪些全局对象?
每个Gradle开始执行编译的是,都会有一个gradle
对象。这个对象是个全局对象。
而我们每个Project
在它本身也有一个Project
对象。而在multiproject
中。还有一个
rootProject
对象。
之后有空,再详细介绍,从buildscript,allprojects ,dependencies
等 DSL
进行介绍吧。
以及rootProject
对象的详细说明,例如 buildDir
是什么等等。
希望本篇文章,能帮助大家了解下Android Studio
中的Gradle
插件。
更多的与Gradle 相关的内容,可以通过:Gradle (zinyan.com) 了解。
评论区