進行gradle編譯android項目時。輸出日志
圖1
任務 :app:compileDebugKotlin 與 :app:greendao 兩個任務存在隐形依賴關系。
但是聲明的依賴關系如下圖所示:
是完全符合greendao 官方文檔的方式聲明的。
但是項目編譯期間輸出日志 兩個task 存在隐形依賴關系。
存在這個問題帶來的影響是:
:app:compileDebugKotlin 任務執行優化被禁用。會嚴重拖慢gradle編譯速度。
解決方式:
在 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的執行順序。
6 最終得出解決方案
project.afterEvaluate{
getTasksByName("compileDebugKotlin",false).each {
it.mustRunAfter("greendao")
// it.dependsOn("greendao")
}
}
我們使用mustRunAfter 而不用 dependsOn 。目的是為了降低task之間的耦合性。感興趣的同學可以自行搜尋兩個api的差異。
我們舉一反三下:
不局限于具體某兩個任務存在隐形依賴 可以用這種思路解決。我們要任何兩個task之間存在隐形依賴關系,都可用這種思路去排查解決