侧边栏壁纸
博主头像
Z同学博主等级

工作磨平激情前,坚持技术的热忱。 欢迎光临Z同学的技术小站。 分享最新的互联网知识。

  • 累计撰写 274 篇文章
  • 累计创建 55 个标签
  • 累计收到 74 条评论

Android Gradle 基本组件:Task,build.gradle等文件介绍

Z同学
2022-02-16 / 0 评论 / 1 点赞 / 281 阅读 / 2,780 字
温馨提示:
本文最后更新于 2022-02-16,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

前言

在前一篇介绍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在构建的时候都包含了一系列的TaskGradle 术语中 Build Script 指向的就是每个Project对象。

image-20220216101854988

例如上面的截图下,Task是指:androidDependenciessigningReportbuildclean等等。合起来统称为Tasks。归属于app。在Gradle中app就是一个Project

这些Task,其实就是一个一个的脚本操作。Gradle会按照编译的规则进行执行相应的Task。一直到最终的成品输出。

总结:Gradle中的每一个待编译的工程都是一个Project,而一个具体的编译过程是由一个又一个的Task来定义并执行的。

例如我们在编译一个app的时候,Build面板中输出的一连串的Task

image-20220216102445848

执行到最后的时候 通常都是有一个 BUILD SUCCESSFUL ,代表编译完毕。

image-20220216102545249

上面就是介绍了 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文件

image-20220216104012274

也就是我们在Android Studio中常见的两个配置文件。

  • build.gradle:配置其他子Project对象,例如为子Project添加属性,添加全局公用属性等。
  • settings.gradle:这个文件告诉Gradle,这个multiProjects中一共包含多少个子Project。只有在这个里面定义的ProjectGradle才能正确识别。

Task

TaskGradle中代表了一些要执行的任务。每一个Task都需要和Project进行绑定关联。

我们在Android Studio中的很多Task 都是系统已经帮我们配置了。通过插件实现的一系列Task。而这个插件是在build.gradle文件中定义的。

image-20220216110124744

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

image-20220216111516172

UP-TO-DATE :代表本次编译,没有修改。可以直接使用上次编译的结果。

NO-SOURCE:代表没有数据,也就是说不满足该Task的执行条件。该Task就不会运行了。

如果没有这两个标注的,那么就代表本次编译需要重新执行的Task了。

很多时候我们提高编译效果。也是优化这方面,减少非必要的Task来达到我们尽快编译的需求。

对象

我们介绍了,在使用Gradle进行编译的时候,每个android module都是一个Project对象。而相应的gradle脚本在底层运行过程中,都转换成了java对象。

那么它的开头是什么?有哪些全局对象?

每个Gradle开始执行编译的是,都会有一个gradle对象。这个对象是个全局对象。

而我们每个Project 在它本身也有一个Project对象。而在multiproject中。还有一个

rootProject对象。

之后有空,再详细介绍,从buildscript,allprojects ,dependenciesDSL进行介绍吧。

以及rootProject对象的详细说明,例如 buildDir 是什么等等。

希望本篇文章,能帮助大家了解下Android Studio中的Gradle插件。

更多的与Gradle 相关的内容,可以通过:Gradle (zinyan.com) 了解。

1

评论区