Gradle

随着移动设备硬件能力的提升,Android 系统开放的特质开始显现,各种开发的奇技淫巧、黑科技不断涌现
Gradle是当前非常“劲爆”的构建工具
在 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,领域相关语言
Gradleg官方定义

Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具;它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,也增加了基于Kotlin语言的kotlin-based DSL,抛弃了基于XML的各种繁琐配置
面向Java应用为主;当前其支持的语言C++、Java、Groovy]、Kotlin、Scala和Swift,计划未来将支持更多的语言
Gradle是一个基于JVM的构建工具,是一款通用灵活的构建工具;支持maven, Ivy仓库,支持传递性依赖管理,而不需要远程仓库或者是pom.xml和ivy.xml配置文件,基于Groovy,build脚本使用Groovy编写
Gradle使用说明
●** Gradle是一个工具**,通过执行build.gradle来实现build的功能,build.gradle这个build脚本是需要程序员自己来编写的,可以使用groovy语言来编写,功能强大而且直观;也可以直接引入其他人已经编写好的脚本或工具来实现build,引入方法为通过apply plugin: 'plugin名'语句实现,plugin可以是build脚本也可以是java程序
●** Gradle官方提供了很多常用的build plugin,比如我们这次创建项目引入的‘war’plugin,他是继承自‘java**’这个plugin,在实现‘java’plugin中关于build java程序的基础上,额外定义了java web项目目录、打包war包等功能,剔除了打包jar包的功能,具体详情可以在Gradle官方文档中查看到
● build操作通过引入相应的plugin基本就可以实现了,在平时的使用过程中,我们主要对Gradle的操作是添加第三方依赖,让Gradle帮我们管理这些第三方依赖
● 通过手动操作引入一个第三方依赖(例如spring core) 前往spring官网找到其提供的spring core下载地址 选择一个需要的版本下载下来 解压,将得到的jar包移动到我们项目的classpath目录下 只需三步,看起来并不是很复杂
● 但是一个项目需要引入的第三方依赖的数量往往是十分巨大的,而且假如我们下载的spring core版本是4.3.6,并且这是一个多人共同协作的项目,当大家的工作合并起来时,如果有人使用的是4.2.1版本,我们是很难发现这个不同的,而这却可能导致BUG;同时,要删除某些不再需要的依赖时我们只能去classpath目录下找到它并手动删除掉
● 使用Gradle引入一个第三方依赖(例如spring core)
● Gradle兼容maven仓库,所以可以直接使用maven仓库来导入第三方依赖;maven仓库是按照一定协议来存放各种第三方依赖库的空间,可以通过groupID和artifactid定位来找到自己需要的第三方依赖库
● 在build.gradle中指定用来下载依赖库的仓库,可以使用网址或者本地地址来指定,也可以使用“mavenCentral()”这些gradle定义的地址来使用默认的仓库
●在dependencies中使用写入依赖库所在组(group),名称(name),版本号(version)
● 仓库只需要定义一次,通过上面的配置gradle就会从定义好的仓库中找到相应的依赖包下载下来并编译好,然后就可以直接在代码中使用了
● 在mvnrepository这个远程maven仓库中,它提供了引入相应依赖包的配置,只需复制下来黏贴到buil.gradle文件中即可
通过build工具管理依赖库的优点
● 方便,不需要进行各种文件操作
● 直观,项目中使用了哪些第三方依赖一目了然
● 统一,同一项目中的成员只要保证使用同一build脚本就可以做到环境和依赖包的统一
Gradleg优点

● 构建过程十分灵活,支持基于Groovy语言编写脚本,侧重于构建过程的灵活性,适合于构建复杂度较高的项目,可以完成非常复杂的构建 比如springboot(需要依赖Invoker等插件) gradle相比服务端java,在Android上更为流行,主要也是Android上更侧重构建的复杂性和多样性
● 构建效率高,为什么速度快?引入了build cache(构建缓存) 官方数据,Gradle比maven构建速度快2~10倍 这也是很多开源项目从maven迁移到gradle的重要原因之一
扩展性
● 依赖Groovy的动态性,Gralde能够写出基于DSL的代码,对于复杂的项目而言,很容易维护
● 另外,Gradle也支持插件机制,目前已经有很多Gradle的可用插件,像Java, War, Jetty等,使用起来非常方便
社区支持
Gradle的发展离不开社区的支持。目前,很多著名的开源组件,像Hibernate,Spring等都开始使用Gradle作为自动化构建工具
Gradle里有两个基本概念
项目(projects)和任务(tasks)
● 项目由多个任务组成,一个项目可以理解为提供给不同设备的构建版本,如桌面版、网页版、安卓版、iOS版等等,也可以理解为一种行为,例如部署应用到生产环境
● 任务相当于Ant的target,可以理解成一个构建中原子性的工作,例如编译、打包、执行等。需要注意的是,Ant中他自己的命令例如javac、copy等也叫做task,但Ant的task远没有Gradle的task那么自由
Gradle的构建分两个阶段
● 第一阶段是设置阶段(configuration phase),分析构建脚本,处理依赖关系和执行顺序等,脚本本身也需要依赖来完成自身的分析
● 第二阶段是执行阶段(execution phase),此阶段真正构建项目并执行项目下的各个任务
尾述
现在点击《Android学习笔记》
即可免费获取更多Android资讯、Android学习笔记、面试真题
技术是无止境的,你需要对自己提交的每一行代码、使用的每一个工具负责,不断挖掘其底层原理,才能使自己的技术升华到更高的层面
Android 架构师之路还很漫长,与君共勉
PS:有问题欢迎指正,可以在评论区留下你的建议和感受;
欢迎大家点赞评论,觉得内容可以的话,可以转发分享一下
网友评论