1.什么是Gradle?
gradle是一个项目构建工具,是google官方推荐的Android项目编译工具。什么是构建工具呢?构建工具是可以让开发者以可执行和有序的任务来表达自动化需求。假设你想要编译源代码,将生成的class文件拷贝到某个目录,然后将该目录组装成可交付的软件。这个交付的软件可以是一个ZIP文件,比如,它可以被发布到某一个运行环境中。简单来讲:把源代码生成可执行程序。
2.Gradle的优点
- 灵活性
- 完全控制
- 目标链
- 依赖管理
- 约定优于配置
- 多模块项目
- 插件扩展
Gradle构建脚本是声明式的,可读的,并且清晰地表达它们的意图。用Groovy而不是XML写代码,挥洒着Gradle基于约定构建的哲理,大大地降低构建脚本的大小而且易读。
3.开始使用Gradle
每个Gradle构建都是以一个脚本开始的,构建脚本默认的名字是build.gradle,当在shell中执行gradle命令时,Gradle会寻找名字是build.gradle的文件,如果找不到就会显示一个帮助信息。
下面我们在一个项目根目录下的build.gradle下实践:
在文件中,定义一个独立的原子性工作,在上面的例子中:task在Gradle就是一个任务,而上面的任务就是将hello world打印出来。下面在Terminal 执行gradle hello:
注意:要配置gradle路径请自行网上的方法
从上面的结果可以看出,当运行脚本时,就会看到输出“hello world”
另外,我们可以使用gradle -q hello命令来加快运行速度:
通过-q定义可选命令行选项quiet,告诉Gradle只输出task相关的信息。
task和action是groovy这门语言的重要元素,名字为doLast的action几乎自表达了它的含义。它是task执行的最后一个action。Gradle还允许使用一种更为精简的方式来指定相同的逻辑。使用左移符号<<来简单地代表doLast。
下面使用更高级的特性
代码中引用了关键字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:
从上面结果可以看出:
4.使用Gradle的命令行
1.执行gradle -q tasks :列出项目中所有可用的task
这时候会有疑问,在构建脚本中定义的其他task去哪了。
2.执行gradle -q tasks --all列出项目内所有的task信息
在Other tasks中在这里可以找到groupTherapy,mGradle0,mGradle1,mGradle2和startTaskone
5.任务的执行
在上诉例子中,都是通过命令gradle添加一个参数来执行指定的任务,Gradle的命令行实现会确保任务和它们的所有依赖都被执行,自己也可以在命令行通过参数定义,一次执行多个任务,例如:执行gradle mGradle0 groupTherapy会先执行mGradle0,然后执行groupTherapy。
任务都是通常只执行一次,无论是在命令行中指定还是作为另一个任务的依赖。
任务名字缩写
gradle另外一个特性就是能以驼峰式的缩写在命令行上运行任务,例如在上诉例子中:执行gradle mG0 gT即可得到上诉运行的结果。
在上面的截图中可得知是没问题的。
*注意
如果定义两个缩写都相同的task的时候就会出错 例如:
在build.gradle多定义一个task名为gouTest
现在运行gradle mG0 gT:
导致下面的错误:
执行时排除任务
有时候想要在构建运行时排除一个指定任务,这时候可以通过命令行-x来实现。假设现在需要排除mGradle0:
命令行选项
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
这时候查看任务管理器:
可以发现守护进程在进行中,注意:守护进程会在3小时空闲时间自动过期。任何时候你都可以选择执行构建不使用守护进程,加上--no--daemon即可。如果手动停止守护进程,执行gradle --stop命令即可。
下面展示如何在构建apk中,在AndroidManifest.xml添加meta-data,用Gradle脚本来自动完成:
第一种方法:
在app下的build.gradle编写:
提前导入:
import groovy.xml.*
然后在Terminal下输入:
打包后查看AndroidManifest.xml
即可成功。
第二种方法:
导入impor这两个类:
import com.android.build.gradle.api.ApplicationVariant
import groovy.xml.XmlUtil
同样也是可以的