快速入门安卓Gradle指南(5/10)Task介绍
牛客高级系列专栏:
安卓(安卓系统开发也要掌握)
- 想通关安卓面试,请看:《150道安卓高频面试题目录及答案链接》
- 想通关安卓系统面试,请看:《140道安卓系统Framework面试题目录及答案链接》
- 想进阶安卓开发,请看:《Android进阶知识体系解析_15大安卓进阶必备知识点》
- 想了解安卓APP完整开发流程,请看:《安卓APP完整开发流程》
- 想掌握安卓App性能优化,请看:《安卓性能优化讲解和实战专栏》
- 想掌握Gradle语法,制作Gradle插件,请看:《安卓Gradle语法解析和实践大全》
嵌入式
- 想通关嵌入式面试,请看: 《111道嵌入式面试题目录及答案链接》
- 想多掌握几个嵌入式项目,请看:《6个嵌入式项目交流分享(附源码)》
本人是2020年毕业于广东工业大学研究生:许乔丹,有国内大厂CVTE和世界500强企业安卓开发经验,该专栏整理本人对安卓Gradle的理解。网上安卓资料千千万,笔者将继续维护专栏,承诺提供专栏内容免费技术答疑,直接咨询即可,助您提高安卓学习效率!
目录开始⬇
在 Gradle 中,任务(Task)是构建过程中的基本单元,每个任务都是一个独立的构建单元,可以单独执行,也可以依赖于其他任务执行。
1、任务的定义和创建
在 Gradle 中,任务是通过 Task 类来定义的。可以通过 task 方法来创建一个任务,例如:
- 直接创建
task myTask {
// 任务的具体实现代码
}
上面的代码定义了一个名为 myTask 的任务。
- 直接用任务名称创建
def Task myTask=task(myTask)
myTask.doLast {
// 任务的具体实现代码
}
- 任务名称+任务配置创建
def Task myTask=task(myTask, group:BasePlugin.BUILD_GROUP)
myTask.doLast {
// 任务的具体实现代码
}
上面的group是任务配置项,代表了分组,后续会讲解。
- TaskContainer的create方法创建
tasks.create(name: 'myTask') << { //xurui 干嘛用<<号
// 任务的具体实现代码
}
- 动态定义任务 动态定义任务是指在运行时定义任务的名称:
3.times {num ->
task "task$num" << {
println "task $num"
}
}
其中times方法可以重复执行某个代码块,可以指定的次数,上面循环创建3个任务,其中num依次是0,1,2,因此动态创建的任务名称依次是task1,task2,task3,这就实现了运行时定义任务名称的目的。
此时运行gradle -q task1,会打印:
task 0
- 自定义任务
Gradle中的任务都是继承自DefaultTask类,所以我们可以自己定义一个类也继承自DefaultTask类,然后设置要要执行的动作,记得用@TaskAction注解标记,可以添加多个,如下:
class MyTask extends DefaultTask {
@TaskAction
def ss1() {
println("This is MyTask --> action1!")
}
@TaskAction
def ss2() {
println("This is MyTask --> action2!")
}
}
task speak(type: MyTask) {
println("This is AA!")
doFirst {
println("This is doFirst!")
}
doLast {
println("This is doLast!")
}
}
2、任务的执行
任务的执行可以通过 Gradle 命令行来触发,例如定义了如下任务:
task myTask {
println "hello"
}
接着在命令行执行:
gradle -q myTask
上面的命令会执行名为 myTask 的任务,最终在命令行打印出“hello”。其中-q参数是Gradle 只输出错误和警告信息,因此会把println语句打印出来。除了通过命令行执行任务外,任务还可以通过其他任务的依赖关系来自动执行。我们来看看什么是任务的依赖关系。
3、任务的依赖关系
任务可以通过 dependsOn 方法来指定它依赖的其他任务,任务依赖会决定任务执行的先后顺序,如果任务A依赖任务B,也就是说任务B是被依赖的任务,则先执行任务B再执行任务A,例如:
task myTaskB {
// 任务的具体实现代码
}
task myTaskA {
dependsOn myTaskB
// 任务的具体实现代码
}
上面的代码定义了两个任务,myTaskA 依赖于 myTaskB,也就是说,当执行 myTaskA 时,会先执行 myTaskB。
依赖方式
- 参数依赖
task A {
doLast { println "TaskA.." }
}
task B {
doLast { println "TaskB.." }
}
task C(dependsOn: [A,B]) {
doLast { println "TaskC.." }
}
- 内部依赖
task C {
dependsOn=[A,B]
doLast { println "TaskC.." }
}
- 外部依赖
C.dependsOn(A,B)
上面三种依赖方式最终打印都是:
TaskA..
TaskB..
TaskC..
因为C是依赖A和B,所以C最慢打印,这个好理解。但就算把括号里面的A和B的顺序调换过来,执行的顺序还是ABC,而不是BAC。这是因为被依赖的任务的执行顺序是根据该任务被添加到项目里来排序,因为上面任务A写在任务B上面,系统就先把任务A排在前面。
如果一定要将执行顺序改为BAC,可以让任务A依赖任务B,这时候任务B就比任务A先执行了。
- 跨项目依赖
4、任务的输入和输出
任务的输入是指任务执行前所需要的数据或资源,比如代码文件、配置文件、依赖库等。在 Gradle 中,可以通过 inputs 属性来指定任务的输入。当任务执行前,Gradle 会检查这些输入是否存在或者是否发生了变化,如果有变化,则会重新执行任务。这样可以避免因为缓存等原因导致的错误或者不一致问题。
任务的输出是指任务执行后所生成的数据或者资源,比如编译后的代码文件、文档文件、测试报告等。在 Gradle 中,可以通过 outputs 属性来指定任务的输出。当任务执行后,Gradle 会检查这个目录是否存在或者是否发生了变化,如果有变化,则会认为任务执行成功并将结果输出到这个目录。
task myTask {
inputs.files 'src'
outputs.dir 'build/classes/java/main'
doLast {
// 执行编译代码的操作,并将结果输出到 build/classes/java/main 目录
}
}
5、任务的分组和描述
任务分组是指将任务按照一定的规则分组,便于用户查看和管理任务。在 Gradle 中,可以通过 group 属性来指定任务的分组,比如:
task compileJava {
inputs.files 'src'
outputs.dir 'build/classes/java/main'
group 'build'
doLast {
// 执行编译代码的操作,并将结果输出到 build/classes/java/main 目录
}
}
上面的代码中,group 属性用来指定任务的分组为 'build'。这样,当用户执行 gradle tasks 命令来查看所有任务时,会
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
如果你想学习Android App开发,那么学习Gradle一定是必要的。 Gradle是一种构建工具,用于编译和构建Android应用程序,它可以自动处理依赖关系,生成APK文件等。通过本指南,你将掌握Gradle的基本概念和使用技巧,以及如何在工程中配置Gradle。通过学习Gradle,你可以更高效地构建和管理你的Android应用程序,提高你的开发效率,从而更好地满足用户需求。
