Skip to content

构建缓存深度解析

源:Gradle 构建缓存

Build Cache 不同于 UP-TO-DATE。后者只能在本地复用 build 目录,而前者支持跨机器复用编译结果。

1. 缓存键 (Cache Key) 的组成

Gradle 为每个 Task 生成一个唯一的指纹。指纹由以下三部分组成:

  1. 输入 (Inputs): 源码、资源文件、依赖库版本。
  2. 属性 (Properties): Task 定义中的参数(如 minifyEnabled)。
  3. Task 实现: Task 自身的代码逻辑(字节码)。

缓存失效元凶

如果你在 Task 代码中使用 new Date() 或写入了绝对路径(如 C:/Users/virogu/...),那么指纹每次都会变,缓存将彻底失效。

2. 远程缓存 (Remote Cache)

在大型团队中,你可以搭建一个中央缓存服务器(如使用 HTTP 或 Google Cloud Storage)。

配置: settings.gradle.kts

kotlin
buildCache {
    remote<HttpBuildCache> {
        url = uri("https://gradle-cache.company.com/cache/")
        isPush = true // 允许本地将结果推送到远程
        credentials {
            username = "..."
            password = "..."
        }
    }
}

3. 性能排查:为什么没有命中缓存?

当你想排查为什么某个 Task 总是重新运行,使用 --info 参数:

bash
./gradlew assembleDebug --info

搜索 "Task ... is not up-to-date because...",Gradle 会明确告诉你哪个输入文件发生了变化。

4. 最佳实践:可缓存的 Task

如果你编写自定义 Task,请务必标注 @CacheableTask

kotlin
@CacheableTask
abstract class MyTask : DefaultTask() {
    // 使用 @PathSensitive 忽略文件的绝对路径,只关注相对路径
    @get:InputFiles
    @get:PathSensitive(PathSensitivity.RELATIVE)
    abstract val inputFiles: ConfigurableFileCollection
    
    // ...
}