转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/76408024
本文出自【赵彦军的博客】html
关于 gradle 相关运用,能够移步 :Android Gradle使用总结java
Groovy是一种动态语言,它和Java相似(算是Java的升级版,可是又具有脚本语言的特色),都在Java虚拟机中运行。当运行Groovy脚本时它会先被编译成Java类字节码,而后经过JVM虚拟机执行这个Java字节码类。android
关于 groovy 相关知识,移步到这里:Groovy 使用彻底解析git
每次构建(build)至少由一个project构成,一个project 由一到多个task构成。每一个task表明了构建过程中的一个原子性操做,好比编译,打包,生成javadoc,发布等等这些操做。api
gradle : 一个 project 包含多个 task,一个 task 包含多个 Action微信
project -- task1 (Action一、Action2...) -- task2 (Action一、Action2...) -- ...
task 任务的名字 { //do some things }
build.gradleapp
//定义 task , 名字 hello task hello{ println "hello world" } //定义 task,名字 hello task(hello2){ println "hello world2" } //定义 task,名字 hello3 task ('hello3'){ println "hello world3" }
//执行 hello task gradlew hello //执行 hello2 task gradlew hello2 //执行 hello3 task gradlew hello3
在上面的举例中,是一个非正式的 task , 说非正式是由于建立的 task 里面没有 action 。task 本质上又是由一组被顺序执行的 Action 对象构成,Action实际上是一段代码块,相似于Java中的方法。ide
//在Action 队列头部添加Action Task doFirst(Action<? super Task> action); Task doFirst(Closure action); //在Action 队列尾部添加Action Task doLast(Action<? super Task> action); Task doLast(Closure action); //已通过时了,建议用 doLast 代替 Task leftShift(Closure action); //删除全部的Action Task deleteAllActions();
build.gradle工具
//建立一个名字为hello的 task task hello { //建立一个 Action , 添加到 Action 列表的头部 doFirst(new Action<Task>() { @Override void execute(Task task) { println "action1++++++++++" } }) //建立一个 Action , 添加到 Action 列表的头部 doFirst { println "action2++++++++++" } }
在 Action 列表中添加了 两个 Action , Action 列表以下图所示:gradle
运行 hello task : gradle hello
运行结果:
action2++++++++++ action1++++++++++
leftShift 的做用和 doLast 同样,在action 列表尾部添加一个Action,只不过如今过期了,官方建议用 doLast 代替。下面举个小例子:
build.gradle
task hello { //在 Action 列表尾部添加一个 Action leftShift { println "+++++" } }
leftShift 还有一种简洁写法,用 <<
代替, 以下所示:
build.gradle
task hello <<{ //在 Action 列表尾部添加一个 Action println "+++++" }
那么问题来了,task 中的 Action 在何时执行?
会去读取根工程中 setting.gradle 中的 include 信息,决定有哪几个工程加入构建,建立 project 实例,好比下面有三个工程: include ':app', ':lib1', ':lib2 。
会去执行全部工程的 build.gradle 脚本,配置 project对象,一个对象由多个任务组成,
此阶段也会去建立、配置task及相关信息。
根据gradle命令传递过来的task名称,执行相关依赖任务。Task 的 Action 会在这个阶段执行。
在上面讲解了建立 task 的基本方式,其实 gradle api 给咱们提供了其余的方式建立 task ,下面讲解其余两种方式。
build.gradle
//建立 hello2 task tasks.create("hello2"){ doFirst { println "hello2+++++" } }
class MyTask extends DefaultTask { @TaskAction void action(){ println "action1+++++" } } //建立 hello3 task task hello3 (type: MyTask){ doLast{ println "action2+++++" } }
运行 hello3 task: gradlew hello3
输出
action1+++++
action2+++++
build.gradle
task task1 << { println "我是task1----" } task task2 << { println "我是task2----" } //task2 依赖 task1, 执行task2以前先执行task1 task2.dependsOn task1
执行 task2
gradlew task2
执行效果
我是task1----
我是task2----
task task1 << { println "我是task1----" } task task2 << { println "我是task2----" } //task2 运行以前先运行task1 task2.mustRunAfter task1
执行 task1 : gradlew task1
我是task1----
执行 task2 : gradlew task2
我是task2----
同时执行 task一、task2 : gradlew task1 task2
我是task1----
我是task2----
build.gradle
task task1 << { println "我是task1----" } task task2 << { println "我是task2----" } task task3 << { println "我是task3----" } task2.mustRunAfter task1 task3.mustRunAfter task1
执行 gradlew task1 task2 task3
我是task1----
我是task2----
我是task3----
执行 gradlew task1 task3 task2
我是task1----
我是task3----
我是task1----
在出现语法矛盾的状况下,依赖关系造成闭环,编译器会报错
task1.mustRunAfter task2 task2.mustRunAfter task1
造成依赖关系无关紧要。
build.gradle
task task1 << { println "我是task1----" } task task2 << { println "我是task2----" } task1.shouldRunAfter task2
运行: gradlew task1 task2
我是task2----
我是task1----
在出现语法矛盾的状况下,依赖关系造成闭环,会自动打破闭环。不会报错
gradle 默认提供了不少 task 给咱们使用,好比 copy、delete
build.gradle
task 任务的名字 (type: Copy) { //action }
//数据源目录,多个目录 public AbstractCopyTask from(Object... sourcePaths) //目标目录,单一 public AbstractCopyTask into(Object destDir) //过滤文件 包含 public AbstractCopyTask include(String... includes) //过滤文件 排除 public AbstractCopyTask exclude(String... excludes) //从新命名,老名字 新名字 public AbstractCopyTask rename(String sourceRegEx, String replaceWith) //删除文件 Project 接口 boolean delete(Object... paths);
task copyImage(type: Copy) { from 'C:\\Users\\yiba_zyj\\Desktop\\gradle\\copy' into 'C:\\Users\\yiba_zyj\\Desktop' }
task copyImage(type: Copy) { from 'C:\\Users\\yiba_zyj\\Desktop\\gradle\\copy' , 'C:\\Users\\yiba_zyj\\Desktop\\gradle\\copy' into 'C:\\Users\\yiba_zyj\\Desktop' }
只会复制后缀为 .jpg 的文件
task copyImage(type: Copy) { from 'C:\\Users\\yiba_zyj\\Desktop\\gradle\\copy' into 'C:\\Users\\yiba_zyj\\Desktop' include "*.jpg" }
task copyImage(type: Copy) { from 'C:\\Users\\yiba_zyj\\Desktop\\gradle\\copy' into 'C:\\Users\\yiba_zyj\\Desktop' include "*.jpg" exclude "image1.jpg" rename("image2.jpg","123.jpg") }
文件覆盖规则
相同文件覆盖
Copy 类的继承图
Copy (类) - AbstractCopyTask (抽象类) (from、 into、 include、rename) -ConventionTask(抽象类) - DefaultTask (类) - AbstractTask (抽象类) - TaskInternal (接口) - Task(接口) -Comparable<Task>, ExtensionAware(接口) -Project(接口) (delete 方法)
build.gradle
task deleteFile(type: Delete) { //删除Android 更目录的aaa 文件 delete '../aaa' }
build.gradle
task deleteFile(type: Delete) { //删除系统桌面 delete delete "C:\\Users\\yiba_zyj\\Desktop\\gradle\\delete" }
build.gradle
task deleteFile{ //do some things }
运行
gradlew dF 等价 gradlew deleteFile
打包时候运行 gradlew assembleRelease
,能够简写成 gradlew aR
查看项目全部默认自带的 task,不包括自定义 task
gradlew tasks
查看全部 task (默认 task + 自定义task)
gradlew tasks --all
查看某个 task 的相关信息,这些结果包含了任务的路径、类型以及描述信息等
gradlew help --task taskName
查看 gradle 版本
gradlew -version
task task1 << { description = "这是一段描述信息" println "我是task1----" }
在上面的介绍中,运行 task 的方式是用 gradlew
, 那咱们怎么用 gradle
。若是在终端运行 gradle
就会提示 gradle 不是内部或外部命令,也不是可运行的程序或批处理文件。
'gradle' 不是内部或外部命令,也不是可运行的程序或批处理文件。
官网下载:http://services.gradle.org/distributions/
下载完成后,我将压缩包解压放在 d 盘的 soft 目录中。
环境变量
D:\soft\gradle-4.3-all
Path
D:\soft\gradle-4.3-all\gradle-4.3\bin
我的微信号:zhaoyanjun125 , 欢迎关注