Gradle增量构建需显式声明输入输出才能生效,Java/Kotlin默认开启但需检查配置,自定义Task须用注解标记inputs/outputs,配合构建缓存和配置缓存可大幅提升速度。

Gradle 的增量构建不是开关一开就自动生效的“魔法”,而是依赖输入(inputs)和输出(outputs)的精确声明,让 Gradle 能判断“这次要不要重跑”。只要改了代码,它只编译变动的类及其直接影响的产物,跳过其余部分——这是把 5 分钟编译压到 30 秒的核心机制。
确认并启用基础增量编译支持
Java 和 Kotlin 默认已开启增量编译,但需确保配置未被覆盖或禁用:
- Java 项目:检查
build.gradle或build.gradle.kts中是否显式关闭了增量(如options.incremental = false),删掉或设为true - Kotlin 项目:在
kotlin块中确认incremental = true(Gradle 7.0+ 默认开启,但仍建议显式声明) - Android 项目:在
android { compileOptions { } }和kotlinOptions中分别设置incremental = true
让每个自定义 Task 支持增量执行
你写的任何自定义 Task(比如资源拷贝、代码生成、JSON 转 Java 类),只有明确定义了 inputs 和 outputs,Gradle 才能跳过它。否则哪怕没改一行,也会强制重跑:
- 用
@InputFile、@InputDirectory、@OutputDirectory等注解标记属性(Kotlin DSL 推荐用inputs.files/outputs.dir链式写法) - 避免把非决定性变量(如
System.currentTimeMillis()、随机数、未冻结的集合)作为 input;否则每次构建都“变”,Task 永远不复用 - 确保 Task 是确定性的:相同输入 → 相同输出。若输出内容受环境变量或网络影响,就不能用于增量构建
配合构建缓存(Build Cache)放大效果
增量构建解决“单次构建内跳过”,构建缓存解决“跨多次构建复用”。两者叠加,效果翻倍:
立即学习“Java免费学习笔记(深入)”;
- 在
gradle.properties中添加:org.gradle.caching=true - 本地缓存默认开启;如需团队共享,可配置远程 HTTP 缓存服务(如 Gradle Enterprise 或自建 Artifactory 缓存代理)
- 注意:缓存对 Task 的 inputs/outputs 更敏感——如果某 Task 的 output 目录里混入了时间戳文件,整个缓存会失效
避免配置阶段拖慢整体节奏
即使编译快了,如果每次构建都要花 10 秒解析脚本、创建几百个 Task,增量也白搭。关键优化点:
- 用
tasks.register()替代tasks.create(),延迟 Task 实例化直到真正需要执行 - 升级到 Gradle 8.0+,启用 Configuration Cache(在
gradle.properties加org.gradle.configuration-cache=true)——它把配置结果缓存下来,后续构建直接跳过配置阶段 - 移除构建脚本中耗时的逻辑(如遍历文件系统、调用外部命令),改用 lazy 属性或 Provider 封装


















