第 5 章 · Task 全攻略:增量构建可视化

3 个互动演示帮你看清"为啥声明了 input/output 性能就提升 10 倍"。

⚡ 实测对比:声明 input/output 前后的构建速度

左边的 Task 没有声明 input/output,每次都全量执行;右边的 Task 声明了,没改就跳过。点几次"构建"按钮,看看差距。

📂 模拟项目源码(点击文件 = 修改它)

❌ 没声明 input/output 的 Task

tasks.register("processBad") {
    doLast {
        files.forEach { /* process */ }
    }
}
实际执行次数
0
累计耗时
0 s

✅ 声明了 input/output 的 Task

tasks.register("processGood") {
    inputs.dir("src")
    outputs.dir("build/processed")
    doLast {
        files.forEach { /* process */ }
    }
}
实际执行次数
0
累计耗时
0 s
💡 试试这个流程:
1. 不点任何文件 → 直接连点 5 次"同时跑两种 Task"
2. 观察:没声明的每次都跑 5s,声明的第 2 次起秒过
3. 然后点一个文件"修改"它 → 再跑:声明的 Task 才会重新执行

📦 Gradle 内置 Task 类型大全

选一个常用类型,看示例代码 + 适用场景。

🏷 Input / Output 注解速查表

自定义 Task 类的属性必须用这些注解标注,Gradle 才能为它做增量构建。

📥 输入类注解(Input)

📤 输出类注解(Output)

⭐ 特殊注解

💡 实战建议:
  • 所有 input 都要声明,否则增量构建无法生效
  • 所有 output 都要声明,否则别人 dependsOn 你时拿不到数据
  • @CacheableTask 类级别注解:标记后输出可以被构建缓存复用
  • 路径不重要时配 @PathSensitive(NONE),避免移动文件就重跑