当前位置: 首页 > 科技观察

GradleforAndroid系列:Gradle为何如此受欢迎

时间:2023-03-13 14:17:18 科技观察

AndroidStudio已经占领了市场,构建工具Gradle的地位无可比拟。我们需要学习并利用它为我们创造价值。在深入研究Gradle之前,有必要了解它为何如此受欢迎。Android应用的构建过程Android应用的构建过程非常复杂,如图:主要有以下几个步骤:aapt编译主要资源文件(layout、values等),Java代码R文件中引用的是通过Java编译器编译成JVM字节码(.class文件)JVM字节码再通过dex工具转换成dalvik字节码(.dex文件)。然后将这些.dex文件、编译后的资源文件和其他资源文件(比如图片)打包成一个apk。apk文件在安装前会被debug/releasekey文件签名,安装到设备上。几个注意点上面步骤中的第一步是主资源文件。一些特殊的资源文件是不会被编译的,比如assets目录下的文件,raw目录下的文件和图片,都不会被编译。只是raw下的文件会在R文件中生成一个id。如果你正式签署apk,你需要使用zipalign工具来对齐apk。这样做的好处是在应用程序运行时会减少内存开销。从上面的介绍大家可以看到我意识到,这么复杂的构建过程,手动完成太残忍了,所以才有了各种各样的构建工具。Android构建的旧宠:Ant、Maven在Gradle之前广泛使用的是ApacheAnt和Maven。AntAnt于2000年发布,并迅速成为最流行的Java项目构建工具。Ant的优点是:简单易学,无需特别准备即可上手。基于过程式编程思想,构建非常灵活,后期可以支持插件化。不利的一面是使用XML作为脚本配置格式,除非它是一个非常小的项目,否则它很快就会变得难以管理。MavenMaven于2004年发布,目的是为了解决使用Ant带来的一些问题。Maven也使用XML作为构建配置的文件格式,但文件结构发生了巨大变化:Ant要求开发人员列出执行任务所需的所有命令,而Maven依赖约定并提供现成的可调用目标。Maven的一个比较重要的进步就是能够自动从网上下载依赖(当然Ant后来通过Ivy也有这个功能),它彻底改变了我们开发软件的方式。Maven的缺点是:依赖管理不能很好地处理同一个库文件的不同版本之间的冲突(Ivy在这方面更好)XML作为一种配置文件格式具有严格的结构层次和标准,Maven很难自定义它主要是解决了依赖管理的问题,但是使用XML的错误让它重蹈覆辙。事实上,用Maven编写复杂的、自定义的构建脚本是很困难的。在大型项目中,它通常不会做任何“特别”的事情。几百行代码,连Ant都不如。前人在反思前两种构建工具的错误后,提出了DSL(DomainSpecialLanguage,领域特殊语言)的概念,目标是设计一种能够解决特定领域问题的语言。就构建而言,DSL的一个成功示例是Gradle。Android构建新宠:Gradle,2012年发布,深刻吸取了前人的经验教训,并进行了诸多改进。Gradle有一个约定优于配置的原则,为设置和属性提供默认值,这使得它比Ant或Maven更容易上手。Gradle构建脚本不再使用xml,而是使用基于Groovy的DSL编写(Groovy是一种基于Java虚拟机的动态语言,所以Android开发者会比较熟悉),这样构建脚本比使用Ant和Maven的写法更清晰简洁。下面是Maven代码和Gradle代码的对比,实现同样的目标:Gradle既有Ant的强大和灵活性,也有Maven的依赖管理。它支持插件并且易于使用。因此一经推出便受到广泛关注,并于2013年被谷歌选为AndroidStudio的默认构建工具。Gradle的设计方式使其可以轻松扩展以构建和插入现有的构建过程。当谷歌推广Gradle和AndroidStudio时,目标是让代码重用、构建变体、配置和自定义构建过程更容易。有些人可能会担心是否需要学习新语言Groovy。书中特别提到:Groovy代码非常容易阅读。如果您学过Java,那么学习Groovy的曲线不会陡峭。如果您想构建自己的任务和插件,那么对Groovy有更深入的了解尤为重要。但是因为Groovy是基于Java虚拟机的,所以您可以用Java或其他基于Java虚拟机的语言编写自定义插件。Gradle的关键概念和构建生命周期Gradle中有两个关键概念:项目和任务。每个build.gradle构建脚本文件代表一个工程工程:task任务在构建脚本中定义:每次构建至少包含一个工程,每个工程至少包含一个任务。构建生命周期一次Gradle构建通常包括以下三个阶段:1.此时会创建初始化项目实例,如果这个项目中有多个模块,或者依赖多个库,它们都有对应的build.gradle文件,将创建多个项目实例。2.配置构建脚本在这个阶段执行,为每个项目实例创建和配置任务。3.这个阶段的执行Gradle会根据构建脚本的配置来决定执行哪些任务。不同的任务之间可能存在相互依赖关系,因此Gradle会在配置阶段生成依赖图。没有依赖关系的任务通常先执行,然后其他任务一个一个执行。任务一旦执行,就无法再次执行。GradleWrapperGradle在不断的发展,可能会出现新版本与旧版本不兼容的情况,所以官方提供了GradleWrapper来让我们兼容和适配不同的版本,保证构建的可重复性。普通的Gradle脚本命令是:gradle...而GradleWrapper命令只是在gradle...后面加了一个w:gradlew...在Mac下略有不同:./gradlew...开发者或者自动构建系统可以使用wrapper来运行gradle命令,它会处理兼容性等问题。所以我们甚至不需要安装gradle,直接使用gradlewrapper就可以了,就像AndroidStudio中的推荐:我没有使用上图中的wrapper,因为当你运行gradlew命令时,gradlewrapper会自动下载所需但你没有gradle版本并使用。多人协作的时候,很可能有人修改了gradle版本上传到git,然后运行命令的时候需要下载半天。不过官方还是推荐使用wrapper,毕竟比较稳定。总结本文比较了Ant和Maven,介绍了Gradle的一些优点和基本概念。了解了为什么要使用Gradle以及它有什么优势之后,对于我们以后更多的了解Gradle的使用会有帮助。