Gradle 简介
概念:Gradle是专注于灵活性和性能的开源的 代码构建 自动化工具。Gradle构建脚本是使用Groovy或Kotlin DSL 编写的;Gradle是一个基于 Apache Ant 和 Apache Maven 概念的项目自动化构建工具,支持依赖管理和多项目,类似 Maven,但比之简单轻便。它使用一种基于 Groovy 的特定领域语言来声明项目设置,而不是传统的 XML。
特性:
- 高度可定制 - Gradle以最基本的方式可定制和可扩展的方式建模。
- 快速 - Gradle通过重新使用以前执行的输出,仅处理已更改的输入以及并行执行任务来快速完成任务。
- 强大 - Gradle是Android的官方构建工具,并支持许多流行的语言和技术。
- 用Java,C ++,Python或您选择的语言编写。用于在任何平台上部署的软件包。进行单仓库或多仓库。并依靠Gradle无与伦比的多功能性来构建所有组件。
- 使用Gradle丰富的API和成熟的插件和集成生态系统来实现自动化方面的雄心勃勃。从头到尾对您的软件交付进行建模,集成和系统化。
- 用优雅,快速的构建来扩展开发。从避免编译到高级缓存等等,我们不懈地追求性能,以便您的团队可以持续交付。
如何理解:
简单的说,Gradle是一个构建工具,它是用来帮助我们构建app的,构建包括编译、打包等过程。我们可以为Gradle指定构建规则,然后它就会根据我们的“命令”自动为我们构建app。Android Studio中默认就使用Gradle来完成应用的构建。有些同学可能会有疑问:”我用AS不记得给Gradle指定过什么构建规则呀,最后不还是能搞出来个apk。“ 实际上,app的构建过程是大同小异的,有一些过程是”通用“的,也就是每个app的构建都要经历一些公共步骤。因此,在我们在创建工程时,Android Studio自动帮我们生成了一些通用构建规则,很多时候我们甚至完全不用修改这些规则就能完成我们app的构建。
有些时候,我们会有一些个性化的构建需求,比如我们引入了第三方库,或者我们想要在通用构建过程中做一些其他的事情,这时我们就要自己在系统默认构建规则上做一些修改。这时候我们就要自己向Gradle”下命令“了,这时候我们就需要用Gradle能听懂的话了,也就是Groovy。Groovy是一种基于JVM的动态语言。
我们在开头处提到“Gradle是一种构建工具”。实际上,当我们想要更灵活的构建过程时,Gradle就成为了一个编程框架,我们可以通过编程让构建过程按我们的意愿进行。也就是说,当我们把Gradle作为构建工具使用时,我们只需要掌握它的配置脚本的基本写法就OK了;而当我们需要对构建流程进行高度定制时,就务必要掌握Groovy等相关知识了。
可以假设我们如果不适用eclipse或者其他集成开发环境去开发我们的项目,这个对于当今的软件来说几乎不可能,项目自动化构建可以帮助我们完成一些重复性规律的工作,避免一些人为造成的错误。
Gradle 历史及由来
问题驱动一:对于Android工程师来说编译/打包等问题立即就成痛点了。一个APP有多个版本,Release版、Debug版、Test版。甚至针对不同APP Store都有不同的版本。在以前ROM的环境下,虽然可以配置Android.mk,但是需要依赖整个Android源码,而且还不能完全做到满足条件,很多事情需要手动搞。一个app如果涉及到多个开发者,手动操作必然会带来混乱。library工程我们需要编译成jar包,然后发布给其他开发者使用。以前是用eclipse的export,做一堆选择。要是能自动编译成jar包就爽了。上述问题对绝大部分APP开发者而言都不陌生,而Gradle作为一种很方便的的构建工具,可以非常轻松得解决构建过程中的各种问题。
问题驱动二:构建,叫build也好,叫make也行。反正就是根据输入信息然后干一堆事情,最后得到几个产出物(Artifact)。最最简单的构建工具就是make了。make就是根据Makefile文件中写的规则,执行对应的命令,然后得到目标产物。日常生活中,和构建最类似的一个场景就是做菜。输入各种食材,然后按固定的工序,最后得到一盘菜。当然,做同样一道菜,由于需求不同,做出来的东西也不尽相同。比如,宫保鸡丁这道菜,回民要求不能放大油、口淡的要求少放盐和各种油、不怕辣的男女汉子们可以要求多放辣子....总之,做菜包含固定的工序,但是对于不同条件或需求,需要做不同的处理。
在Gradle流行之前,常用的构建工具是ANT,然后又进化到Maven。ANT和Maven这两个工具其实也还算方便,现在还有很多地方在使用。但是二者都有一些缺点,所以让更懒得人觉得不是那么方便。比如,Maven编译规则是用XML来编写的。XML虽然通俗易懂,但是很难在xml中描述if{某条件成立,编译某文件}/else{编译其他文件}这样有不同条件的任务。
怎么实现配置文件的条件判断?对程序员而言,自然是编程解决,但是这里的编程有几个需求:
- 这种“编程”不要搞得和程序员理解的编程那样复杂。寥寥几笔,轻轻松松把要做的事情描述出来就最好不过。所以,Gradle选择了Groovy。Groovy基于Java并拓展了Java。 Java程序员可以无缝切换到使用Groovy开发程序。Groovy说白了就是把写Java程序变得像写脚本一样简单。写完就可以执行,Groovy内部会将其编译成Java class然后启动虚拟机来执行。当然,这些底层的渣活不需要你管。
- 除了可以用很灵活的语言来写构建规则外,Gradle另外一个特点就是它是一种 DSL,即Domain Specific Language,领域相关语言。什么是DSL,说白了它是某个行业中的行话,比如程序员经常说的:BUG、开源、产品经理等等,表示了某种特殊含义,Gradle中也有类似的行话,比如sourceSets代表源文件的集合等.....。以后我们都会接触到这些行话。那么,对使用者而言,这些行话的好处是什么呢?这就是:一句行话可以包含很多意思,而且在这个行当里的人一听就懂,不用解释。另外,基于行话,我们甚至可以建立一个模板,使用者只要往这个模板里填必须要填的内容,Gradle就可以非常漂亮得完成工作,得到想要的东西。这就和现在的智能炒菜机器似的,只要选择菜谱,把食材准备好,剩下的事情就不用你操心了。吃货们对这种做菜方式肯定是以反感为主,太没有特色了。但是程序员对Gradle类似做法却热烈拥抱。
Gradle 最新版
Gradle 6.4 现已发布。该版本具有对构建和测试 Java 模块的高度期望的支持、为更好地构建逻辑组织而进行预编译的 Groovy DSL 脚本插件、以及每个项目一个锁定文件,从而减少了使用依赖项锁定的项目中的锁定文件。具体内容如下:
- 构建、测试和运行 Java 模块。在此版本中,Gradle 支持 Java 模块系统,它具有编译和执行 Java 模块测试所需的一切。用户还可以构建 Javadoc 并运行应用程序。
- 预编译的 Groovy DSL 脚本插件。Gradle 现在允许除 Kotlin DSL 外,还使用 Groovy DSL 编写预编译的脚本插件。
- 每个项目一个依赖项锁定文件。此版本增加了一种改进的依赖项锁定文件格式,可在使用此功能的大多数项目中减少锁定文件的数量。此外,使用此格式时,可以配置锁定文件名和位置。该格式将成为 Gradle 7.0 中的默认锁定文件格式。
- 更好的依赖项变量匹配错误消息。此版本引入了针对 JVM 生态系统的更清晰的变体匹配错误消息。Gradle 6.4 通过使这些错误消息更易于理解并向控制台引入颜色来突出显示问题,从而改进了这些错误消息。
- PMD 代码质量插件的改进。从 Gradle 6.4 开始,PMD 插件默认使用增量分析,这样可以大大减少后续构建的分析时间。同时,PMD插 件现在允许用户设置构建失败之前的违规次数, 这样可以更轻松地将 PMD 引入到最初可能存在许多违规行为的现有项目中。
- 有关使用 DEBUG 级别日志记录的安全警告。
此外,Gradle 6.4 中共修复了 42 个问题,更多详细信息可查看发布说明:https://docs.gradle.org/current/release-notes.html