在 Android 项目开发过程中,我们常常会依赖远程仓库中的第三方库或自定义的 AAR 文件。而这些依赖在构建时会被 Gradle 下载并缓存在本地,以加快后续构建速度。然而,这种缓存机制有时也会造成开发中的一些困扰,尤其是当依赖的远程库版本不变但内容更新时,Gradle 不会自动重新下载,从而导致代码没有生效。
本文将详细介绍:
- Android Studio 本地缓存 AAR 的位置
- 如何清除本地缓存
- SNAPSHOT 版本的原理、作用与使用方式
一、本地缓存的目录位置(Windows)
Gradle 默认会将远程依赖缓存到本地用户目录下:
makefile
makefile
复制编辑
C:\Users<你的用户名>.gradle\caches\modules-2\files-2.1\
或者使用系统变量表示为:
shell
shell
复制编辑
%USERPROFILE%.gradle\caches\modules-2\files-2.1\
该目录中按照如下路径层级存储所有的依赖:
xml
php-template
复制编辑
<group>/<artifact>/<version>/<hash>/<artifact>-<version>.aar
例如:
makefile
makefile
复制编辑
C:\Users\YourName.gradle\caches\modules-2\files-2.1\com\github\MyUser\MyLib\1.0.0\xxxxxxxx\MyLib-1.0.0.aar
这里的 hash
是该 AAR 文件的签名摘要,每次发布内容改变后该值会更新。
二、如何清除依赖缓存
当你希望重新下载某个远程 AAR 文件(如该库在远端更新但版本号没变时),你可以通过以下方式清理本地缓存:
1. 手动删除缓存目录
找到目标库的路径,手动删除即可。以删除 com.github.MyUser:MyLib:1.0.0
为例:
shell
shell
复制编辑
%USERPROFILE%.gradle\caches\modules-2\files-2.1\com\github\MyUser\MyLib\
下次构建时,Gradle 会重新下载该 AAR。
2. 使用 Gradle 命令强制刷新
使用以下命令构建项目,可以跳过缓存,强制重新解析所有依赖:
bash
bash
复制编辑
./gradlew build --refresh-dependencies
此命令对所有 SNAPSHOT 和普通版本均有效。
3. 删除整个 Gradle 缓存目录(不推荐)
可以直接删除整个缓存目录:
shell
shell
复制编辑
%USERPROFILE%.gradle\caches\
这样所有项目依赖都会被清除,后续构建将重新下载所有库。建议仅在需要清理大量旧依赖时使用。
三、关于 SNAPSHOT 的使用与原理
什么是 SNAPSHOT
SNAPSHOT
是 Maven 和 Gradle 中的一种特殊版本标识,表示该版本是 开发中 的 非稳定版本,其构建结果可以随时发生变化。
示例:
arduino
groovy
复制编辑
implementation 'com.example:mylibrary:1.0.0-SNAPSHOT'
在依赖声明中使用 -SNAPSHOT
后缀,就意味着这是一个不固定的版本,每次构建都可能下载不同的内容。
SNAPSHOT 的作用
- 在不更改版本号的前提下发布新版本
- 避免频繁变更依赖方的版本声明
- 适合开发中测试、调试阶段频繁变更的库
与非 SNAPSHOT 的区别
特性 | 正式版本(如 1.0.0) | SNAPSHOT 版本(如 1.0.0-SNAPSHOT) |
---|---|---|
是否可变 | 否 | 是 |
本地缓存时间 | 永久(除非版本号变更) | 默认 24 小时 |
是否可强制刷新 | 是 | 是 |
使用场景 | 发布正式版、稳定依赖 | 调试阶段、频繁更新库 |
如何确保 SNAPSHOT 每次都更新
默认情况下,Gradle 对 SNAPSHOT 的缓存时间为 24 小时。要让其每次构建都从远程拉取,可以在 build.gradle
中添加如下配置:
python
groovy
复制编辑
configurations.all {
resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}
这样每次构建都会重新获取最新的 SNAPSHOT 依赖,非常适合持续集成或频繁调试阶段使用。
四、开发自定义 AAR 并使用 SNAPSHOT 的建议
如果你在开发自己的库,并通过私服(如 Nexus、Artifactory)或 JitPack 发布,推荐你使用 SNAPSHOT
来进行快速迭代测试。
常见步骤如下:
-
使用 SNAPSHOT 命名构建 AAR:
inigroovy 复制编辑 version = "1.0.0-SNAPSHOT"
-
发布到远程仓库
-
在主工程中引入依赖:
arduinogroovy 复制编辑 implementation 'com.example:mylibrary:1.0.0-SNAPSHOT'
-
在主工程设置强制刷新策略(或使用
--refresh-dependencies
)
五、常见问题与解答
问:为什么我改了远程库代码,但主项目没有变化?
答:因为 Gradle 使用了缓存机制,未检测到版本变化就不会重新下载。推荐使用 SNAPSHOT 或刷新命令。
问:我不想使用 SNAPSHOT,每次改版本号麻烦,有什么替代方式?
答:你可以在构建系统中自动修改版本号(如加时间戳),或者继续使用 SNAPSHOT 配合 --refresh-dependencies
。
问:可以手动上传 SNAPSHOT 到 JitPack 吗?
答:JitPack 会根据你提交的 Git commit 或分支构建对应版本。如果你使用的是 -SNAPSHOT
,JitPack 会重新构建并提供最新的构建产物。
总结
在 Android 开发中,理解 Gradle 的缓存机制对于高效调试和管理远程依赖非常重要。合理使用 SNAPSHOT 可以大大提升开发效率,避免重复手动修改版本号。而手动清理缓存或使用 --refresh-dependencies
也可以解决版本不更新的问题。
如需更自动化的管理方式,还可以借助 CI/CD 工具在构建时动态处理 SNAPSHOT 版本与发布流程。