./gradlew --dry-run 可预览真实执行顺序:它构建任务依赖图(DAG)并按拓扑序输出所有将执行的任务(含UP-TO-DATE/SKIPPED),不触发doFirst/doLast等动作,精准反映Gradle调度决策。

执行 ./gradlew --dry-run 查看任务执行顺序
Gradle 不会在真正执行前告诉你“接下来会跑哪些 task”,但 --dry-run 是最直接、最可靠的预览方式。它跳过所有实际动作,只构建执行图并打印将要执行的 task 列表(按拓扑顺序)。
运行命令后,你会看到类似这样的输出:
Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0. :app:preBuild UP-TO-DATE :app:preDebugBuild UP-TO-DATE :app:compileDebugAidl NO-SOURCE :app:generateDebugBuildConfig :app:compileDebugRenderscript NO-SOURCE :app:generateDebugResValues ...
这个顺序就是 Gradle 在真实执行时的顺序 —— 它已根据 dependsOn、mustRunAfter、输入/输出声明等完成 DAG 拓扑排序。
-
--dry-run不触发任何配置块外的逻辑(比如doFirst/doLast),只反映任务图结构 - 如果某个 task 显示
UP-TO-DATE,说明它被跳过,但它仍出现在执行计划中(只是不运行) - 子项目任务会带完整路径(如
:lib:compileJava),避免和根项目同名 task 混淆
用 ./gradlew tasks --all 辅助判断依赖链
tasks --all 不显示执行顺序,但它列出每个 task 的 Depends on 字段,是手动推导顺序的关键依据。
例如输出中看到:
:app:assembleDebug Depends on: [:app:compileDebugSources, :app:mergeDebugResources, :app:processDebugManifest]
就说明 :app:assembleDebug 必须在那三个 task 之后执行 —— 这是 dependsOn 声明的显式依赖。
- 注意:隐式依赖(如通过
inputs/outputs声明的 task)不会出现在Depends on行里,但会被--dry-run正确捕获 - 如果想快速查某个 task 依赖了谁,可用
./gradlew help --task :app:assembleDebug -
tasks --all输出很长,建议配合grep筛选:./gradlew tasks --all | grep -A5 'assembleDebug'
为什么 ./gradlew build 不等于“从上到下执行脚本里的 task”
很多人误以为 build.gradle 里 task 定义的先后顺序 = 执行顺序 —— 这完全错误。Gradle 的执行顺序由配置阶段生成的有向无环图(DAG)决定,和代码书写顺序无关。
常见误解场景:
- 你在
build.gradle最后定义了task cleanup,但它可能因为cleanup.dependsOn('build')被排在最后执行 - 两个 task 都没声明依赖,但一个 task 的
outputs.file是另一个的inputs.file,Gradle 会自动插入执行约束 -
doFirst/doLast只影响单个 task 内部行为顺序,不影响 task 之间的调度
真正起作用的是:依赖声明、输入/输出关系、mustRunAfter/shouldRunAfter 等 API —— 它们都在配置阶段被解析进 DAG。
调试复杂依赖时优先看 --dry-run + --console=plain
默认控制台输出带颜色和进度条,反而干扰顺序观察。加 --console=plain 可让输出更线性、易复制分析:
./gradlew --dry-run --console=plain assembleDebug
输出会去掉 ANSI 转义符,每行一个 task,严格按执行流排列,适合粘贴进文本编辑器逐行追踪。
- 如果发现顺序不符合预期,90% 是因为某个 task 的
dependsOn漏写了,或inputs.files指向了未声明为 task 输出的路径 -
--dry-run不会执行doFirst/doLast,所以看不到日志打印,但能 100% 反映调度器的真实决策 - 别依赖 IDE 的 Gradle 面板顺序 —— 它只按字母或分组排序,不是执行顺序
真正容易被忽略的点是:Gradle 的执行顺序不是静态写死的,它每次都会重新计算 DAG。哪怕只改了一个 inputs.file 路径,整个执行流都可能变化 —— 所以别靠记忆,每次怀疑顺序出问题,就跑一次 --dry-run。











