如何在CircleCI 2.0上处理Gradle缓存?Android构建缓存方案失效
解决Android Gradle依赖缓存失效的问题
你的缓存配置失效,大概率是因为缓存Key覆盖的配置文件不全,以及缓存路径不够精准——这是Gradle缓存在CI环境里常见的坑,我来帮你一步步修正:
1. 扩展缓存Key的校验范围
当前的Key只用到了android/build.gradle和android/app/build.gradle的校验和,但影响Gradle依赖解析的文件远不止这些:
gradle/wrapper/gradle-wrapper.properties:Gradle版本变化会直接改变缓存结构,旧版本的缓存和新版本不兼容android/settings.gradle:如果项目添加/移除模块、调整依赖仓库,这个文件的变化会影响依赖下载android/gradle.properties:依赖代理、仓库配置、JVM参数等都会影响依赖获取逻辑- 其他模块的
build.gradle(如果有多个模块的话)
把这些文件都加入缓存Key的校验,确保任何影响依赖的配置变化都会触发新的缓存:
restore_cache: key: android-build-{{ checksum "gradle/wrapper/gradle-wrapper.properties" }}-{{ checksum "android/build.gradle" }}-{{ checksum "android/app/build.gradle" }}-{{ checksum "android/settings.gradle" }}-{{ checksum "android/gradle.properties" }} save_cache: paths: - ~/.gradle/caches - ~/.gradle/wrapper key: android-build-{{ checksum "gradle/wrapper/gradle-wrapper.properties" }}-{{ checksum "android/build.gradle" }}-{{ checksum "android/app/build.gradle" }}-{{ checksum "android/settings.gradle" }}-{{ checksum "android/gradle.properties" }}
2. 缩小缓存路径范围
原来的~/.gradle包含了很多不需要缓存的内容:比如构建输出、Gradle守护进程日志、临时文件等。只缓存caches(依赖缓存)和wrapper(Gradle安装包)两个目录,既能减少缓存体积,又能避免无关文件干扰缓存有效性。
3. 排查动态依赖的影响
如果你的项目里用了动态版本依赖(比如implementation 'com.android.tools.build:gradle:7.+'),即使缓存了依赖,Gradle每次构建都会去远程仓库检查更新,导致缓存失效。建议把所有依赖版本固定为具体号(比如7.4.2),这样缓存能稳定命中。
4. 验证缓存命中情况
在CI运行时查看restore_cache步骤的日志:
- 如果显示“Cache hit”,说明配置生效;
- 如果显示“Cache miss”,手动计算上述文件的校验和,对比CI生成的缓存Key,看看是不是有文件被修改但没加入Key里。
内容的提问来源于stack exchange,提问作者Sibelius Seraphini
相关产品推荐
相关产品推荐

