1.什么是Gradle?

gradle是一个项目构建工具,是google官方推荐的Android项目编译工具。什么是构建工具呢?构建工具是可以让开发者以可执行和有序的任务来表达自动化需求。假设你想要编译源代码,将生成的class文件拷贝到某个目录,然后将该目录组装成可交付的软件。这个交付的软件可以是一个ZIP文件,比如,它可以被发布到某一个运行环境中。简单来讲:把源代码生成可执行程序

2.Gradle的优点
  1. 灵活性
  2. 完全控制
  3. 目标链
  4. 依赖管理
  5. 约定优于配置
  6. 多模块项目
  7. 插件扩展

Gradle构建脚本是声明式的,可读的,并且清晰地表达它们的意图。用Groovy而不是XML写代码,挥洒着Gradle基于约定构建的哲理,大大地降低构建脚本的大小而且易读。

3.开始使用Gradle

每个Gradle构建都是以一个脚本开始的,构建脚本默认的名字是build.gradle,当在shell中执行gradle命令时,Gradle会寻找名字是build.gradle的文件,如果找不到就会显示一个帮助信息。

下面我们在一个项目根目录下的build.gradle下实践:

Android 34对应的gradle android中gradle的作用_Gradle

Android 34对应的gradle android中gradle的作用_守护进程_02

在文件中,定义一个独立的原子性工作,在上面的例子中:task在Gradle就是一个任务,而上面的任务就是将hello world打印出来。下面在Terminal 执行gradle hello:

注意:要配置gradle路径请自行网上的方法

Android 34对应的gradle android中gradle的作用_Android_03

从上面的结果可以看出,当运行脚本时,就会看到输出“hello world”

另外,我们可以使用gradle -q hello命令来加快运行速度:

Android 34对应的gradle android中gradle的作用_守护进程_04

通过-q定义可选命令行选项quiet,告诉Gradle只输出task相关的信息。

task和action是groovy这门语言的重要元素,名字为doLast的action几乎自表达了它的含义。它是task执行的最后一个action。Gradle还允许使用一种更为精简的方式来指定相同的逻辑。使用左移符号<<来简单地代表doLast。

Android 34对应的gradle android中gradle的作用_Gradle_05

下面使用更高级的特性

Android 34对应的gradle android中gradle的作用_Android_06

代码中引用了关键字dependsOn来说明task之间的依赖。Gradle会确保被依赖的task总会在定义该依赖的task之前执行。实际上,dependsOn是task的一个方法,另外Gradle有一个特性就是很好地和Ant去集成,因为拥有对Groovy语言特性的完全访问权,所以用write()方法来打印信息 ,这个方法非常方便在task中使用,每个脚本都带有一个ant属性赋予了直接访问Ant任务的能力,在上面的例子中,可以使用Ant的任务echo去打印"Gradle"。

另外Gradle提供的一个特性就是定义动态task,就是指可以在运行中指定任务的名字。在上诉列子中,使用了Groovy的times方法创建了3个task。Groovy自动暴露一个隐式变量it来指定循环迭代的次数,可以使用这个计数器来构建task的名字,对于第一次的循环task就叫做mGradle0。

下面运行gradle groupTherapy:

Android 34对应的gradle android中gradle的作用_守护进程_07

从上面结果可以看出:

Android 34对应的gradle android中gradle的作用_Android 34对应的gradle_08

4.使用Gradle的命令行

1.执行gradle -q tasks :列出项目中所有可用的task

Android 34对应的gradle android中gradle的作用_Android_09

这时候会有疑问,在构建脚本中定义的其他task去哪了。

2.执行gradle -q tasks --all列出项目内所有的task信息

在Other tasks中在这里可以找到groupTherapy,mGradle0,mGradle1,mGradle2和startTaskone

Android 34对应的gradle android中gradle的作用_Android 34对应的gradle_10

5.任务的执行

在上诉例子中,都是通过命令gradle添加一个参数来执行指定的任务,Gradle的命令行实现会确保任务和它们的所有依赖都被执行,自己也可以在命令行通过参数定义,一次执行多个任务,例如:执行gradle mGradle0 groupTherapy会先执行mGradle0,然后执行groupTherapy。

Android 34对应的gradle android中gradle的作用_命令行_11

任务都是通常只执行一次,无论是在命令行中指定还是作为另一个任务的依赖。

任务名字缩写

gradle另外一个特性就是能以驼峰式的缩写在命令行上运行任务,例如在上诉例子中:执行gradle mG0 gT即可得到上诉运行的结果。

Android 34对应的gradle android中gradle的作用_命令行_12

在上面的截图中可得知是没问题的。

*注意

如果定义两个缩写都相同的task的时候就会出错 例如:

在build.gradle多定义一个task名为gouTest

Android 34对应的gradle android中gradle的作用_Android_13

现在运行gradle mG0 gT:

导致下面的错误:

Android 34对应的gradle android中gradle的作用_Android 34对应的gradle_14

执行时排除任务

有时候想要在构建运行时排除一个指定任务,这时候可以通过命令行-x来实现。假设现在需要排除mGradle0:

Android 34对应的gradle android中gradle的作用_Gradle_15

命令行选项

gradle xxxx -is 或者gradle xxxx-i-s :打印出在执行期间发生错误时的堆栈踪迹信息

gradle xxxxx --help:打印出所有可用的命令行选项,描述信息

gradle -b xxx.gradle:可以执行一个特定的名字的构建脚本

gradle xxxx --offline:离线模式运行构建,仅仅在本地缓存检查依赖是否存在

守护进程

当你日常工作都要跟Gradle打交道的时候,你会发现你需要不断的重复构建,这时候你发现效率是极其重要,每次初始化一个构建时,JVM都要启动一次,Gradle的依赖都要载入到类加载器中,而且还要建立项目对象模型,这个过程需要一段时间,这时候Gradle守护进程就是为了解决这个问题

什么是Gradle守护进程呢?

Gradle守护进程就是以后台的方式运行Gradle,gradle命令就会在后续的构建之中重用之前创建的进程,以避免启动时造成的开销。

如何启动守护进程呢?

在运行gradle命令时加上 -- daemon选项。一旦启动你可以去看系统进程表:

Max OS X和linux:在shell中运行命令ps | grep gradle

windows:通过打开任务管理器去查看

这时候实践一下:

gradle mG0 gT --daemon

Android 34对应的gradle android中gradle的作用_Gradle_16

这时候查看任务管理器:

Android 34对应的gradle android中gradle的作用_Android 34对应的gradle_17

可以发现守护进程在进行中,注意:守护进程会在3小时空闲时间自动过期。任何时候你都可以选择执行构建不使用守护进程,加上--no--daemon即可。如果手动停止守护进程,执行gradle --stop命令即可。

Android 34对应的gradle android中gradle的作用_Gradle_18

下面展示如何在构建apk中,在AndroidManifest.xml添加meta-data,用Gradle脚本来自动完成:


第一种方法:

在app下的build.gradle编写:

提前导入:

import groovy.xml.*

Android 34对应的gradle android中gradle的作用_Android_19

然后在Terminal下输入:

Android 34对应的gradle android中gradle的作用_Android 34对应的gradle_20

打包后查看AndroidManifest.xml

Android 34对应的gradle android中gradle的作用_守护进程_21

即可成功。

第二种方法:

导入impor这两个类:
import com.android.build.gradle.api.ApplicationVariant

import groovy.xml.XmlUtil

Android 34对应的gradle android中gradle的作用_守护进程_22

同样也是可以的