天天看点

Between tasks without declaring an explicit or implicit dependency

作者:手机太TM好玩了丶

进行gradle编译android项目时。输出日志

Between tasks without declaring an explicit or implicit dependency

图1

任务 :app:compileDebugKotlin 与 :app:greendao 两个任务存在隐形依赖关系。

但是声明的依赖关系如下图所示:

Between tasks without declaring an explicit or implicit dependency

是完全符合greendao 官方文档的方式声明的。

但是项目编译期间输出日志 两个task 存在隐形依赖关系。

存在这个问题带来的影响是:

:app:compileDebugKotlin 任务执行优化被禁用。会严重拖慢gradle编译速度。

解决方式:

Between tasks without declaring an explicit or implicit dependency

在 app模块下的build.gradle 文件中。与dependencies 平级 添加如下代码:

project.afterEvaluate{
    getTasksByName("compileDebugKotlin",false).each {
        it.mustRunAfter("greendao")
//        it.dependsOn("greendao")
    }
}           

可解决:app:compileDebugKotlin 与 :app:greendao 两个任务存在隐形依赖关系的问题。

复盘解决该问题的流程:

1 熟悉整个 Gradle 生命周期的流程,从而知道在那个gradle生命周期解决入手

参考链接:https://blog.csdn.net/cpcpcp123/article/details/127836230

2 找到:app:compileDebugKotlin 和 :app:greendao 两个task在哪里执行。

3 两个task 前面都有“:app” 说明是属于app模块下的任务。

4 依据我们对项目业务的分析可知,在执行:app:compileDebugKotlin task前,必须要先执行:app:greendao。

5 从第一步可知,在gradle 配置阶段我们可主动干预两个task的执行顺序。

Between tasks without declaring an explicit or implicit dependency

6 最终得出解决方案

project.afterEvaluate{
    getTasksByName("compileDebugKotlin",false).each {
        it.mustRunAfter("greendao")
//        it.dependsOn("greendao")
    }
}
           

我们使用mustRunAfter 而不用 dependsOn 。目的是为了降低task之间的耦合性。感兴趣的同学可以自行搜索两个api的差异。

我们举一反三下:

不局限于具体某两个任务存在隐形依赖 可以用这种思路解决。我们要任何两个task之间存在隐形依赖关系,都可用这种思路去排查解决