blog.csdn.net/zhaoyanjun6…
【赵彦军的博客】
关于 gradle 相关运用,可以移步 :Android Gradle使用总结
Groovy是一种动态语言,它和Java类似(算是Java的升级版,但是又具备脚本语言的特点),都在Java虚拟机中运行。当运行Groovy脚本时它会先被编译成Java类字节码,然后通过JVM虚拟机执行这个Java字节码类。
关于 groovy 相关知识,移步到这里:Groovy 使用完全解析
每次构建(build)至少由一个project构成,一个project 由一到多个task构成。每个task代表了构建过程当中的一个原子性操作,比如编译,打包,生成javadoc,发布等等这些操作。
gradle : 一个 project 包含多个 task,一个 task 包含多个 Action
- project
- -- task1 (Action1、Action2...)
- -- task2 (Action1、Action2...)
- -- ...
- task任务的名字 {
- //do some things
- }
build.gradle
- //定义 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中的方法。
- //在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 列表如下图所示:
运行 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—-
我是task2—-
我是task1—- 我是task2—-
build.gradle
- task task1 << {
- println "我是task1----"
- }
- task task2 << {
- println "我是task2----"
- }
- task task3 << {
- println "我是task3----"
- }
- task2.mustRunAfter task1 task3.mustRunAfter task1
我是task1—-
我是task2—-
我是task3—-
我是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'不是内部或外部命令,也不是可运行的程序或批处理文件。
官网下载:services.gradle.org/distributio…
下载完成后,我将压缩包解压放在 d 盘的 soft 目录中。 环境变量
D:\soft\gradle-4.3-all
D:\soft\gradle-4.3-all\gradle-4.3\bin
1、Android Gradle 必备实用技巧
2、Android Gradle使用总结
3、Groovy 使用完全解析
4、深入理解 Android Gradle 详解
个人微信号:zhaoyanjun125 , 欢迎关注
来源: https://juejin.im/entry/59ffdfa651882546b15be5c7