天天看點

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之間存在隐形依賴關系,都可用這種思路去排查解決