美文网首页
Gradle 任务 -- 任务的执行分析

Gradle 任务 -- 任务的执行分析

作者: 冯可乐同学 | 来源:发表于2021-12-31 15:50 被阅读0次

----《Android Gradle 权威指南》学习笔记

总目录:Gradle 学习系列 -- 目录

上一篇:Gradle 任务 -- << 操作符

下一篇:Gradle 任务 -- 任务排序

  1. 学习了任务的相关概念后,有必要对 Task 的执行做一个大概的分析,了解 Task 是如何执行的,配置在 doFirst 中的操作怎么会先执行,配置在 doLast 中的操作后执行,对深入理解 Task有很大帮助。

  2. 当执行一个 Task 的时候,其实就是执行其拥有的 actions 列表,这个列表保存在 Task 对象中的 actions 成员变量中,其类型是一个 List。

  3. 举个栗子,在 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
  1. 当使用 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。

相关代码:https://gitee.com/fzq.com/gradle-demos

相关文章

网友评论

      本文标题:Gradle 任务 -- 任务的执行分析

      本文链接:https://www.haomeiwen.com/subject/rzwcfrtx.html