在之前第一篇文章中说过,Gradle最重要的概念是project和tasks,而一个Project也可以说只是包含了多个task的容器,所以在gradle中tasks的重要性不言而喻了。为了更好的介绍Android中常用的tasks,先来介绍task的基本知识。
我们可以在app的build.gradle文件中定义两个简单task分别hello,hello1:
task hello <<{
print("hello task")
}
task hello1 {
doLast{
print("hello task")
}
}
hello中的“<<”表示追加的意思,即向hello中加入执行过程。我们还可以使用doLast来达到同样的效果,如hello1。
同步之后,我们可以在Android Studio的Gradle标签页看到可以使用的task,我们定义的在other下:
双击相应的task,task将会边执行,例如我们双击hello,那么我们可以得到以下结果:
打印出了hello task,得到了我们想要的结果。
注:这里我们也可以通过命令行运行gradlew tasks命令得到我们可以使用task。
从上边的小例子可以看出,Gradle创建task还是非常自然,非常简单的,上面的task关键字实际上是一个方法调用,该方法属于project。project中存在多个重载的task()方法。并且我们在调用这些方法可以不用将参数放在括号里面。这里还要介绍一个概念TaskContainer,我们自定义的2个task都位于TaskContainer中,project中的tasks属性即表示该TaskContainer。接着看下边的例子:
task showTasks {
println tasks.class
println tasks.size()
}
该task主要打印了TaskContainer的信息和其包含的task的数量,我们在没有加入hello,hello1和加入之后的结果作比较:
可以看出tasks的类型为
class org.gradle.api.internal.tasks.DefaultTaskContainer_Decorated
在加入hello,hello1这两个task之前tasks的size为14,加入之后为16。这里还要说名一下计算的size是包括showTasks本身的。
在上文中我们讲到,通过task()方法创建的Task都被存放在了TaskContainer中,而project又维护了一个TaskContainer类型的属性tasks,那么我们也可以通过create()方法直接向TaskContainer里面添加Task:
tasks.create(name: 'hello2') <<{
print("hello2 task")
}
同时,task之间也是可以相互依赖的,例如我要定义一个hello3的task依赖hello这个task,我们可以这样写:
task hello3(dependsOn: hello) {
print("hello3 task");
}
关于tasks的基本知识就介绍这么多了。下面来看一下Android 常用的tasks。从上边的截图我们可以清楚的看到,当创建一个Android工程时,这个工程将包含android tasks,build tasks,build setup tasks,help tasks,install tasks,verification tasks等。平时我们用的比较多是build tasks,因为它包含了apk打包相关的task:
assemble/assembleDebug/assembleRelease:针对每个版本/debug版/Release版创建一个apk。
clean :清除所有的构建任务的output,包含apk文件
check: 执行Lint检查并且能够在Lint检测到错误后停止运行
build :执行assemble和check
connectedCheck: 在测试机上执行所有测试任务
deviceCheck :执行所有在远程设备上的测试任务
installDebug和installRelease :在设备上安装一个Debug/Release版本
关于assemble,还要说明一点,我们还可以根据要发版的渠道定义相对应的assemble,举个例子,我们想要在豌豆荚发布,那么我们可以定义一个assembleWanDouJia来输出发布到豌豆荚的apk。
build task依赖于check任务,但是不依赖于connectedCheck或者deviceCheck,执行check任务时Lint会产生一些相关文件,可以在app/build/outputs中查看。
在上文已经讲过,除了上边已经存在的task,我们还可以自己定义。这需要结合自己的需求了。Gradle For Android中的tasks就先讲到这儿了,下一篇我准备将一下依赖包的管理。