AS中远程 AAR 缓存的位置与 SNAPSHOT 使用详解

在 Android 项目开发过程中,我们常常会依赖远程仓库中的第三方库或自定义的 AAR 文件。而这些依赖在构建时会被 Gradle 下载并缓存在本地,以加快后续构建速度。然而,这种缓存机制有时也会造成开发中的一些困扰,尤其是当依赖的远程库版本不变但内容更新时,Gradle 不会自动重新下载,从而导致代码没有生效。

本文将详细介绍:

  1. Android Studio 本地缓存 AAR 的位置
  2. 如何清除本地缓存
  3. 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 的作用

  1. 在不更改版本号的前提下发布新版本
  2. 避免频繁变更依赖方的版本声明
  3. 适合开发中测试、调试阶段频繁变更的库

与非 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 来进行快速迭代测试。

常见步骤如下:

  1. 使用 SNAPSHOT 命名构建 AAR:

    ini 复制代码
    groovy
    复制编辑
    version = "1.0.0-SNAPSHOT"
  2. 发布到远程仓库

  3. 在主工程中引入依赖:

    arduino 复制代码
    groovy
    复制编辑
    implementation 'com.example:mylibrary:1.0.0-SNAPSHOT'
  4. 在主工程设置强制刷新策略(或使用 --refresh-dependencies


五、常见问题与解答

问:为什么我改了远程库代码,但主项目没有变化?

答:因为 Gradle 使用了缓存机制,未检测到版本变化就不会重新下载。推荐使用 SNAPSHOT 或刷新命令。

问:我不想使用 SNAPSHOT,每次改版本号麻烦,有什么替代方式?

答:你可以在构建系统中自动修改版本号(如加时间戳),或者继续使用 SNAPSHOT 配合 --refresh-dependencies

问:可以手动上传 SNAPSHOT 到 JitPack 吗?

答:JitPack 会根据你提交的 Git commit 或分支构建对应版本。如果你使用的是 -SNAPSHOT,JitPack 会重新构建并提供最新的构建产物。


总结

在 Android 开发中,理解 Gradle 的缓存机制对于高效调试和管理远程依赖非常重要。合理使用 SNAPSHOT 可以大大提升开发效率,避免重复手动修改版本号。而手动清理缓存或使用 --refresh-dependencies 也可以解决版本不更新的问题。

如需更自动化的管理方式,还可以借助 CI/CD 工具在构建时动态处理 SNAPSHOT 版本与发布流程。

相关推荐
王六岁3 天前
UIAutomatorViewer 安装指南 (macOS m3pro 芯片)
android studio
Mr_万能胶5 天前
到底原研药,来瞧瞧 Google 官方《Android API 设计指南》
android·架构·android studio
BINGCHN5 天前
NSSCTF每日一练 SWPUCTF2021 include--web
android·前端·android studio
Ryan ZHENG6 天前
[Android][踩坑]Android Studio导入core-libart.jar
android·android studio·jar
BoomHe6 天前
车载应用配置系统签名
android·android studio
路人甲ing..6 天前
用 Android Studio 自带的模拟 Android Emulator 调试
android·java·ide·ubuntu·kotlin·android studio
路人甲ing..6 天前
Android Studio 模拟器报错 The emulator process for AVD xxxxx has terminated.
android·java·ide·kotlin·android studio
bqliang7 天前
从喝水到学会 Android ASM 插桩
android·kotlin·android studio
圆肖7 天前
File Inclusion
android·ide·android studio
花花鱼8 天前
android studio引用三方库的方法,比如SmartRefreshLayout
android·ide·android studio