----《Android Gradle 权威指南》学习笔记
-
学习了任务的相关概念后,有必要对 Task 的执行做一个大概的分析,了解 Task 是如何执行的,配置在 doFirst 中的操作怎么会先执行,配置在 doLast 中的操作后执行,对深入理解 Task有很大帮助。
-
当执行一个 Task 的时候,其实就是执行其拥有的 actions 列表,这个列表保存在 Task 对象中的 actions 成员变量中,其类型是一个 List。
-
举个栗子,在 build.gradle 中有以下代码,把 Task 之前执行、Task 本身执行和 Task 之后执行f分别打印:
def Task myTask = task taskExe(type: CustomTask)
myTask.doFirst {
println " Task 执行之前:in doFirst"
}
myTask.doLast {
println " Task 执行之后:in doLast"
}
class CustomTask extends DefaultTask{
@TaskAction
def doSelf() {
println " Task 执行自身:in doSelf"
}
}
在命令行中执行命令:gradle -q taskExe
打印结果:
Task 执行之前:in doFirst
Task 执行自身:in doSelf
Task 执行之后:in doLast
- 当使用 Task 方法创建 taskExe 任务的时候,Gradle 会解析其带有 TaskAction 标注的方法作为其 Task 执行的 Action,然后通过 Task 的 prependParallelSafeAction() 方法把 Action 添加到 action List 中。在 Gradle 源码中,prependParallelSafeAction() 方法如下所示:
说明:在 gradle 源码中, Task.java 是一个接口,其实现类在 AbstractTask.java 中,包括 doFirst()、doLast()、prependParallelSafeAction() 这些方法。
路径分别是:
..\gradle-7.2\src\core-api\org\gradle\api\Task.java
..\gradle-7.2\src\core\org\gradle\api\internal\AbstractTask.java
@Override
public void prependParallelSafeAction(final Action<? super Task> action) {
if (action == null) {
throw new InvalidUserDataException("Action must not be null!");
}
getTaskActions().add(0, wrap(action));
}
同样地,doFirst() 和 doLast() 方法的源码如下:
@Override
public Task doFirst(final String actionName, final Action<? super Task> action) {
hasCustomActions = true;
if (action == null) {
throw new InvalidUserDataException("Action must not be null!");
}
taskMutator.mutate("Task.doFirst(Action)", new Runnable() {
@Override
public void run() {
getTaskActions().add(0, wrap(action, actionName));
}
});
return this;
}
@Override
public Task doLast(final String actionName, final Action<? super Task> action) {
hasCustomActions = true;
if (action == null) {
throw new InvalidUserDataException("Action must not be null!");
}
taskMutator.mutate("Task.doLast(Action)", new Runnable() {
@Override
public void run() {
getTaskActions().add(wrap(action, actionName));
}
});
return this;
}
从源码中可以看出,doFirst() 永远是在 action List 的第一位添加,doLast() 是在 action List 的末尾添加。prependParallelSafeAction() 也是在第一位添加,但是先于 doFirst() 方法,所以这三个方法调用完成后就形成了 doFirst、doSelf、doLast 三部分组成的 actions。
网友评论