构建缓存深度解析
Build Cache 不同于 UP-TO-DATE。后者只能在本地复用 build 目录,而前者支持跨机器复用编译结果。
1. 缓存键 (Cache Key) 的组成
Gradle 为每个 Task 生成一个唯一的指纹。指纹由以下三部分组成:
- 输入 (Inputs): 源码、资源文件、依赖库版本。
- 属性 (Properties): Task 定义中的参数(如
minifyEnabled)。 - 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
// ...
}