前言
是时候开始新的系列了。在本系列中,我们将学习Gradle,这是一个基于JVM的新一代构建工具。可以写一本关于Gradle的书。本系列将简化Gradle对于Android开发的知识。Gradle已经用于Android开发的很多技术系统,如系统搭建、插件、热修复、组件化等。如果不了解Gradle,你对以上技术体系的理解会大打折扣。为了让大家更好的学习Gradle,本文就不介绍Gradle的具体技术细节,先介绍为什么现在使用Gradle。
1.项目自动化
Gradle是一个构建工具,所以为什么要使用构建工具,它需要从项目自动化开始。
我们在开发软件的时候会面临一个类似的情况,就是需要使用IDE进行编码,完成一些功能的时候会进行编译、单元测试、打包等等,这些都需要开发人员手工实现。通用软件是迭代开发的,一个版本接一个版本,每个版本可能有很多功能。如果开发每次都需要手工编译、单元测试、打包来实现功能,显然会非常耗时,容易出现问题,于是项目自动化应运而生。它具有以下优点:
它可以尽量防止开发手动介入从而节省了开发的时间并减少错误的发生。自动化可以自定义有序的步骤来完成代码的编译、测试和打包等工作,让重复的步骤变得简单。IDE可能受到不同操作系统的限制,而自动化构建是不会依赖于特定的操作系统和IDE的,具有平台无关性。2.构建工具构建工具是一个可编程工具,用于实现项目自动化。您可以使用代码来控制构建过程,并最终生成可交付的软件。构建工具可以帮助您创建独立于特定操作系统和集成开发环境的重复、可靠、无需手动的构建。这个可能有点抽象。这里有一个APK建筑的例子。
2.1 apk的施工过程
根据官方流程图,APK的建设过程如下图所示。
APK的建设过程主要分为以下几个步骤:
通过AAPT(Android Asset Packaging Tool)打包res资源文件,比如AndroidManifest.xml、xml布局文件等,并将这些xml文件编译为二进制,其中assets和raw文件夹的文件不会被编译为二进制,最终会生成R.java和resources.arsc文件。AIDL工具会将所有的aidl接口转化为对应的Java接口。所有的Java代码,包括R.java和Java接口都会被Java编译器编译成.class文件。Dex工具会将上一步生成的.class文件、第三库和其他.class文件编译成.dex文件。上一步编译生成的.dex文件、编译过的资源、无需编译的资源(如图片等)会被ApkBuilder工具打包成APK文件。使用Debug Keystore或者Release Keystore对上一步生成的APK文件进行签名。如果是对APK正式签名,还需要使用align工具对APK进行对齐操作,这样应用运行时会减少内存的开销。从以上步骤可以看出,APK的建设过程相当繁琐,而且经常重复。如果没有施工工具,手工完成施工工作无疑会成为开发商的一种煎熬,也会产生很多问题,导致项目开发周期更长。
在Gradle出现之前,有三种基于Java的构建工具:Ant、Gant、Maven,用于Java或Android开发。我们来看看他们的特点是什么。
2.2 Apache Ant
这里的Ant不是指蚂蚁(虽然它的图标是蚂蚁),而是另一种工整的工具。
它是由詹姆斯·邓肯·戴维森(Tomcat的最初开发者)开发的,最初用于构建Tomcat。2000年,Ant成为独立项目并发布。Ant是Java写的一个构建工具。它的核心代码是Java写的,所以具有平台独立性。构建脚本采用XML格式(默认情况下为bulid.xml)。如果你熟悉XML,Ant更容易使用。
蚂蚁构建脚本具有以下风格。
bulid.xml
& lt?xml version="1.0 "编码="UTF-8 "?>。
& ltproject name = " test " default = " hello " >
& ltechomessage="running build.xml,相当于build.gant"/>。
& ltproperty file = " build . properties "/& gt。
& lttarget name = " init " deion = " init target " & gt。
& ltechomessage= "执行初始化目标"/>;
& lt/target>。
& lttarget name = " hello " depends = " init " deion = " hello target " & gt。
& ltechomessage="${echo.msg}"/>。
& lt/target>。
& lt/project>。
Ant的构建脚本由三个基本元素组成:一个项目、多个目标和可用任务。
Apache Ant有以下缺点:
Ant无法获取运行时的信息。XML作为构建脚本的语言,如果构建逻辑复杂,那么构建脚本就会又长又难以维护。Ant需要配合Ivy(一种管理项目依赖工具),否则Ant很难管理依赖。Ant在如何组织项目结构方面没有给出任何指导,这导致Ant虽然灵活性高,但这样的灵活导致每个构建脚本都是唯一的而且很难被理解。2.3 GantGAnt是一个基于蚂蚁的构建工具,使用Groovy在蚂蚁的基础上编写的DSL(领域特定语言)。如果您使用ant来构建,那么Gant是一个不错的选择,但是您不喜欢用XML编写构建脚本,或者现有的XML构建脚本难以维护和管理。
Gant构建文件具有以下样式。
build.gantAnt.echo(消息:'运行build.gant ')
Ant.property(文件:' build.properties ')
def AntProperty = Ant . project . properties
目标(init : 'init target'){
回应(消息:“执行初始化目标”)
}
target(hello:'说hello target') {
取决于(初始化)
回声(消息:antProperty。echo.msg ')
}
setDefaultTarget(你好)
这个build.gant相当于之前ant的bulid.xml。
2.4 Apache Maven
Maven发布于2004年,其目标是改善开发者在使用Ant时面临的一些问题。Maven最初是为了简化雅加达涡轮项目的建设而设计的,经历了从Maven到Maven3的发展。作为后来者,Maven继承了Ant的项目构建功能,也采用了XML作为构建脚本的格式。Maven具有依赖管理和项目管理的功能,并提供了一个中心仓库,可以帮助我们自动下载库文件。
Maven的构建脚本有以下风格。
pom.xml & ltproject xmlns = " http://maven . Apache . org/POM/4 . 0 . 0 " xmlns:xsi = " http://www . w3 . org/2001/XMLSchema-instance "
http://maven.apache.org/xsd/maven-4.0.0.xsd"
& lt模型版本>4.0.0 <。/modelVersion >
& ltgroupId>。com . my company . app & lt;/groupId>。
& ltartifactId>。my-app <。/artifactId >
& lt版本>。1.0-快照<。/version>。
& lt包装>。jar <。/packaging>。
& lt名称>。马文快速启动原型& lt/name>。
& lturl>。http://maven.apache.org & lt;/url>。
& lt依赖关系>。
& lt依赖性>。
& ltgroupId>。junit <。/groupId>。
& ltartifactId>。junit <。/artifactId >
& lt版本>。4.11 <。/version>。
& lt范围>。测试<。/scope>。
& lt/dependency>。
& lt/dependencies>。
& lt/project>。
Maven相对于ant的优势:
Ant是过程式的,开发者需要显示的指定每个目标,以及完成该目标锁需要执行的任务。每一个项目,开发着都需要重新编写这一过程,这样会产生大量的重复。Maven是声明式的,项目的构建过程和过程中的各个阶段都由插件实现,开发者只需要声明项目的基本元素就可以了,这很大程度消除了重复。Ant本身是没有依赖管理,需要配合Ivy来管理依赖,而Maven本身就提供了依赖管理。Maven 使用约定而不是配置,它为工程提供了合理的默认行为,项目会知道去哪个目录寻找源代码以及构建运行时有那些任务去执行,如果你的项目遵从默认值,那么只需要写几行XML配置脚本就可以了。而Ant是使用配置且没有默认行为的。Maven的缺点:
Maven的提供了默认的结构和生命周期,这些可能不适合你的项目需求。为Maven写定制的扩展过于累赘。Maven的中央仓库比较混乱,当无法从中央仓库中得到需要的类库时,我们可以手工下载复制到本地仓库中,也可以建立组织内部的仓库服务器。国内连接Maven的中央仓库比较慢,需要连接国内的Maven镜像仓库。Maven缺乏文档,不便于使用和理解。3.Gradle的特性Gradle是基于JVM的开源构建工具,侧重于灵活性和性能。
从上图可以看出,Gradle结合了Ant、Maven等构建工具的最佳特性。它有一种约定优于配置和强依赖管理的方法。它的构建脚本是由Android的官方构建工具Groovy或者Kotlin DSL编写的。Gradle的构建脚本有以下风格。
build.gradleapply插件:“java”
group= 'com.mycompany.app '
archivesBaseName= 'my-app '
版本= ' 1.0-快照'
仓库{
mavenCentral()
}
依赖项{
testCompile 'junit:4.11 '
}
这个build.gradlet相当于之前Maven的pom.xml。可见Groovy写的代码更少,可读性更强。
下面列出了Gradle不同于竞争对手的特点。
3.1易扩展性
Gradle有很好的扩展性。如果您想在多个构建或项目中共享可重用的代码,Gradle的插件将帮助您实现它。将Gradle插件应用于您的项目将在构建项目的过程中提供很多帮助:为您的项目添加依赖的第三方库,并为您的项目添加有用的默认设置和约定(源代码位置、单元测试代码位置)。Android Gradle插件继承了Java Gradle插件,该插件的内容将在本系列的后续文章中介绍。
3.2采用Groovy
Ant和Maven的构建脚本都是用XML编写的,如果XML逻辑中的内容太多,就不容易维护。Gradle可以使用Groovy DSL构建脚本。Groovy是一种基于Jvm的动态语言。它的语法非常类似于Java,并且与Java兼容,所以您不需要担心学习Groovy的成本。Groovy给Java增加了很多动态类型和灵活的特性。相比于XML,Gradle更具表现力和可读性。
3.3强依赖性管理
Gradle提供了一个可配置且可靠的依赖关系管理方案。一旦相关库被下载并存储在本地缓存中,我们的项目就可以使用了。依赖管理可以在不同的平台和机器上产生相同的构建结果。
3.4灵活协议
Gradle可以为构建项目提供指导和默认值。如果您使用此约定,您的Gradle构建脚本将不会有几行。相比蚂蚁,Gradle不仅提供了合同,还让你很容易违约。
3.5级包装
Gradle Wrapper是Gradle的一个包装器,它的作用是简化Gradle本身的下载、安装和构建。例如,它将下载并构造指定版本的gradle,而不安装Gradle。Gradle的版本很多,可能会有版本兼容的问题。这时候就需要Gradle Wrapper统一Gradle的版本,避免Gradle版本不一致带来的问题。
3.6可以与其他构建工具集成
Gradle可以和Ant,Maven,Ivy整合。例如,我们可以将蚂蚁构建脚本导入到Gradle的构建中。
3.7基础应用编程接口
Gradle显然不能满足所有企业级构建的所有需求,但是构建脚本可以通过Hook Gradle的生命周期进行监控和配置。
3.8社区支持和推广
Gradle是一个开源项目,遵循Apache License 2.0协议。Gradle的优秀特性吸引了很多开发者,形成了Gradle社区。很多开源软件开发者都分享了Gradle的核心代码。
4.总结
本文从项目自动化入手,介绍了常用的构建工具:Ant、Gant和Maven,最后介绍了Gradle的特性,与其他有竞争力的构建工具相比,Gradle具有很大的优势和吸引力,这也是我们现在使用Gradle的原因。
1.《gradle 为什么现在要用Gradle?》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《gradle 为什么现在要用Gradle?》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/tiyu/1588671.html