Gradle for Android系列:为什么Gradle这么火

Android Studio 占领市场后,构建工具 Gradle 的地位无人能比,我们有必要学习、使用它来为我们创造价值。

在深入学习 Gradle 之前,我们有必要了解下它为什么这么流行。

Android 应用的构建过程

Android 应用程序的构建过程非常复杂,如图所示:

主要有以下几步:

  1. 主要的资源文件(layout, values 等)都被 aapt 编译,并且在一个 R 文件中引用
  2. Java 代码被 Java 编译器编译成 JVM 字节码(.class 文件)
  3. JVM 字节码再被 dex 工具转换成 dalvik 字节码(.dex 文件)
  4. 然后这些 .dex 文件、编译过的资源文件和其他资源文件(比如图片)会被打包成一个 apk
  5. apk 文件在安装前会被 debug/release 的 key 文件签名
  6. 安装到设备

几个注意点

  1. 上面的步骤中第一步注意是主要的资源文件,有些特别的资源文件就不会被编译,比如 assets 目录下的文件,raw 目录下的文件还有图片,都不会被编译。只不过 raw 下的文件会在 R 文件里生成 id
  2. 如果对 apk 正式签名,还需要使用 zipalign 工具对 apk 进行对齐操作,这样做的好处是当应用运行时会减少内存的开销

通过上面的介绍可以看到,这么复杂的构建过程如果需要人手动去完成未免太过残忍,于是有了各种的构建工具。

Android 构建的旧爱:Ant, Maven

在 Gradle 之前被广泛使用的是 Apache Ant 和 Maven。

Ant

Ant 2000 年发布,很快成为 Java 项目最流行的构建工具。

Ant 的优点就是:

  • 简单、易学,不需要什么特殊准备就能上手
  • 基于过程式编程思想使得构建非常灵活
  • 后来还能支持插件。

不足之处就是使用 XML 作为脚本配置格式,除非是很小的项目,否则它的 XML 文件很快就大得无法管理。

Maven

Maven 发布于 2004 年。目的是解决使用 Ant 所带来的一些问题。

Maven 也是使用 XML 作为构建配置的文件格式,不过文件结构却有了巨大的变化:

  • Ant 需要开发者将执行 task 所需的全部命令都列出来
  • 而 Maven 依靠约定并提供现成的可调用的目标

不仅如此,Maven 更重要的一个进步是具备从网络上自动下载依赖的能力(当然 Ant 后来通过 Ivy 也具备了这个功能),这革命性地改变了我们开发软件的方式。

Maven 的缺点是:

  • 依赖管理不能很好地处理相同库文件不同版本之间的冲突(Ivy在这方面更好一些)
  • XML 作为配置文件的格式有严格的结构层次和标准,定制化目标很困难

Maven 主要解决了依赖管理的问题,然而使用 XML 的错误使它重蹈覆辙,实际上用 Maven 很难写出复杂、定制化的构建脚本,在大型项目中,它经常什么“特别的”事还没干就有几百行代码,甚至不如 Ant。

前辈们在反省前两种构建工具的错误之后,提出了 DSL (Domain Special Language, 领域专用语言)的概念,目标是设计一套能够解决特定领域问题的语言。在构建这方面,DSL 的一个成功案例就是 Gradle。

Android 构建的新欢:Gradle

2012 年发布的 Gradle 深刻吸取前面几位前辈的经验和教训,集大家之所成,做了很多改进。

Gradle 有约定优于配置的原则,即为设置和属性提供默认值,这使得它比 Ant 或者 Maven 更容易上手。

Gradle 构建脚本不再使用 xml ,而是使用基于 Groovy 的 DSL 进行书写(Groovy 是一种基于 Java 虚拟机的动态语言,因此 Android 开发者看着会很熟悉),从而使得构建脚本比用 Ant 和 Maven 写的更清晰、简洁,下面是实现同样目标的 Maven 代码和 Gradle 代码对比:

Gradle 既有 Ant 的强大和灵活,又有 Maven 的依赖管理,支持插件且易于使用。因此一推出就获得广泛关注,2013 年被 Google 选为 Android Studio 的默认构建工具。

Gradle 设计的方式使得它可以很容易地扩展构建和插入到现有的构建过程中,Google 推广 Gradle 和 Android Studio 时,目标是让代码复用、构建 variant、配置和定制构建过程变得更加简单。

有人可能担心是否需要专门去学习新语言 Groovy,《Gradle for Android》书中专门提到:

Groovy 代码非常易读,如果你学习过 Java,那么学习 Groovy 的曲线不会陡峭。 如果你想构建自己的任务和插件,那么对 Groovy 有更深层次的理解尤为重要。 不过因为 Groovy 是基于 Java 虚拟机的,所以你完全可以用 Java 或者其他基于 Java 虚拟机的语言来编写你的自定义插件。

Gradle 的关键概念及构建生命周期

Gradle 中两个关键的概念:项目和任务。

每个 build.gradle 构建脚本文件代表一个项目 project:

任务 task 定义在构建脚本里:

每次构建至少包括一个项目,每个项目里又至少包括一个任务。

构建生命周期

一个 Gradle 构建通常包括下面三个阶段:

1.初始化

项目实例会在这时被创建,如果这个项目里有多个 module,或者依赖多个 library,并且它们都有对应的 build.gradle 文件,就会创建多个项目实例

2.配置

在这个阶段构建脚本被执行,并且为每个项目实例创建和配置任务

3.执行

在这个阶段 Gradle 将根据构建脚本的配置决定哪些任务会被执行

不同任务之间可能有 相互依赖,因此在配置阶段 Gradle 会生产依赖关系图,没有依赖的任务通常会被优先执行,然后一个接一个执行其他任务。一旦一个任务被执行过,就不会被再次执行。

Gradle Wrapper

Gradle 在不断的发展,有可能存在新版本不兼容旧版本的情况,于是官方为我们提供了 Gradle Wrapper,就是为了兼容和适配不同版本,确保构建是可重复的。

普通的 Gradle 脚本命令是:


  1. gradle ... 

而 Gradle Wrapper 命令只是在 gradle 后加了个 w:


  1. gradlew ... 

在 Mac 下略微有些不同:


  1. ./gradlew ... 

开发者或者自动构建系统可以通过使用 wrapper 来运行 gradle 命令,由它来搞定兼容等问题。因此我们甚至都不需要安装 gradle,直接使用 gradle wrapper 即可,就像 Android Studio 里推荐的一样:

上图我并没有使用 wrapper,是因为当你运行 gradlew 命令时,gradle wrapper 会自动下载需要但是你没有的 gradle 版本并使用。 这在多人协作时,很可能因为别人修改了 gradle 版本、上传到 git,然后导致你运行命令时需要下载半天。

不过官方还是推荐使用 wrapper,毕竟这样更稳定。

总结

这篇文章对比 Ant 和 Maven 介绍了 Gradle 的一些优点和基础概念,在理解 Gradle 为什么会被使用、它有什么优点之后,有助于我们后续深入学习 Gradle 的使用。

作者:shixinzhang

来源:51CTO

时间: 2024-10-04 14:45:28

Gradle for Android系列:为什么Gradle这么火的相关文章

com.android.tools.build:gradle:2.0.0-alpha3 build errors

当Android studio 编译时间过长且出现问题比如下面的提示: java.exe'' finished with non-zero exit value 3. 此时就要检查一下跟目录下面的build.gradle里面的 dependencies { classpath 'com.android.tools.build:grade:2.0.0-alpha3' // NOTE: Do not place your application dependencies here; they bel

Gradle学习系列之一——Gradle快速入门(转)

  这是一个关于Gradle的学习系列,其中包含以下文章: Gradle快速入门 创建Task的多种方法 读懂Gradle语法 增量式构建 自定义Property 使用java Plugin 依赖管理 构建多个Project 自定义Task类型 自定义Plugin   请通过以下方式下载本系列文章的Github示例代码: git clone https://github.com/davenkin/gradle-learning.git     和Maven一样,Gradle只是提供了构建项目的一

Gradle for Android第二篇( Build.gradle入门 )

在这一章,我们将学习以下内容: 理解Gradle文件 编写简单的构建任务 自制构建脚本 理解Gradle脚本 当然我们现在讨论的所有内容都是基于Android studio的,所以请先行下载相关工具.当我们创建一个新的工程,Android studio会默认为我们创建三个gradle文件,两个build.gradle,一个settings.gradle,build.gradle分别放在了根目录和moudle目录下,下面是gradle文件的构成图: MyApp    ├── build.gradl

Gradle for Android第一篇( 从Gradle和AS开始 )

正如大家所见,这是本英文书,而由于国内的gradle翻译资料不全,所以特次开辟专栏,翻译gradle for android这本书,同时添加自己的心得体会以及在实际工作上的实战,希望大家能够喜欢. 如果你是名Android开发新手,或者是名从eclipse切换到Android studio的新手,那么我强烈建议您follow我的文章,正如封面所见,利用gradle构建工具来自动构建你的Android项目.废话不多说,我们直接开始吧. 今天主要介绍Android studio工具的使用,以及cra

gradle打包android程序时,如何修改java文件中的属性值

问题描述 gradle打包android程序时,如何修改java文件中的属性值 工程有个文件例如1.java文件:其中有个public final static String URL = "/www.baidu.com"; 现在的问题是如何在用gradle打包的时候可以更换1.java文件中的URL? ant打包就可以写不同的build.xml,在build.xml中更换URL的字符串,在利用ant构建的时候通过编译不同的build.xml来达到更换URL的目的. 现在不知道gradl

Gradle for Android 第三篇( 依赖管理 )

Gradle for Android 第三篇( 依赖管理 ) 依赖管理是Gradle最闪耀的地方,最好的情景是,你仅仅只需添加一行代码在你的build文件,Gradle会自动从远程仓库为你下载相关的jar包,并且保证你能够正确使用它们.Gradle甚至可以为你做的更多,包括当你在你的工程里添加了多个相同的依赖,gradle会为你排除掉相同的jar包. 作者:佚名来源:Android开发中文站|2017-04-10 17:35  移动端  收藏   分享 依赖管理 依赖管理是Gradle最闪耀的地

Android Studio中Gradle使用详解

转自:http://www.jianshu.com/p/02cb9a0eb2a0 一)基本配置 build配置 buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.2.3' } } Android脚本 apply plugin: 'com.android.application' Android配置 android { compileSdkVersi

Gradle for Android 第四篇( 构建变体 )

当你在开发一个app,通常你会有几个版本.大多数情况是你需要一个开发版本,用来测试app和弄清它的质量,然后还需要一个生产版本.这些版本通常有不同的设置,例如不同的URL地址.更可能的是你可能需要一个免费版和收费版本.基于上述情况,你需要处理不同的版本:开发免费版,开发付费版本,生产免费版,生产付费版,而针对不同的版本不同的配置,这极大增加的管理难度. Gradle有一些方便的方法来管理这些问题.我们很早之前谈过debug和release版本,现在我们谈到另外一个概念,不同的产品版本.构建版本和

Android客户端程序Gradle如何打包_Android

一.前言 android客户端开发进入尾声,负责SEO同事突然发给我一个涉及45个发布渠道的噩耗,之前只发布自有渠道的工作方式(手动修改参数打包)已经不满足需求,所以引入最近比较流行的gradle打包技术. gradle基于groovy语言,引入的原因也方便了以后从现在使用的eclipse开发环境迁移到Android Studio,所以blablabla--,不多说了,先上干货. 二.准备工作 1.首先,如果使用eclipse作为开发环境,需右键点击项目,在菜单中选择"Export-"