大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
本文记录的是今天在群里提到的昨天所踩的一个坑,有关 AndroidStudio 缓存的。
夏河网站建设公司创新互联公司,夏河网站设计制作,有大型网站制作公司丰富经验。已为夏河上1000家提供企业网站建设服务。企业网站搭建\外贸营销网站建设要多少钱,请找那个售后服务好的夏河做网站的公司定做!
先说一下背景。
我负责的一个项目,对一个图表库有外部依赖。这个图表库是我在维护的,由于新功能在开发中,所以我就使用了 SNAPSHOT 版本发布到 OJO(oss.jfrog.org) 上。我在项目中刚更新了依赖,忽然想到还少几个 API,于是发布了 SNAPSHOT 版本。
故事就这样开始了。
这时候回到 AndroidStudio 再去 Sync Project with Gradle Files
肯定是拉不下来的。众所周知,Gradle 的缓存策略中,对于 SNAPSHOT 版本默认的缓存周期是 24 小时,也就是从我上次更新之后,24小时内都会使用上次的缓存。
不周知的也没关系,我在这里补充说明一下,在 Gradle 用户指南的依赖管理一章中,有提到 Gradle 对于动态版本和变化模块的缓存时间默认是 24 小时。
何为动态版本?你见过的像3.+
这种就是动态版本,它会取检查到的最高的版本号。又比如latest.integration
,它也是动态版本。
而变化模块,就是像0.2-SNAPSHOT
这种后面带SNAPSHOT
的版本了。
这两者的区别就是,前者尽管你代码中的版本号写法不变,但实际上它仍然是去取仓库的最新版本。而后者它在仓库中的版本号还是一样,仍然是xxx-SNAPSHOT
,但实际上这个版本所对应的内容已经变了。
这里再多说几句,缓存周期也是可以修改的,在 Gradle 用户指南中同样有详细说明,就是添加如下配置:
configurations.all { resolutionStrategy.cacheDynamicVersionsFor 10, 'minutes' // 动态版本 resolutionStrategy.cacheChangingModulesFor 10, 'minutes' // 变化模块}1234
只是这里我一开始就贪省事,在更新依赖懒得去改。
既然如此,那怎么办?把 ~/.gradle/caches
整个给干掉?
不不不,那样太小题大做。其实这个问题我早已遭遇过,并且对于“汉化”过一遍 Gradle 用户指南的我来说太简单了。命令行下执行:
./gradlew aTD --refresh-dependencies1
这里啰嗦一下,aTD
是项目中一个 Gradle 任务的缩写,全名是 assembleTestingDebug
,其中 Testing
是项目里的一个 ProductFlavor
。这并不重要,重点是后面的参数 --refresh-dependencies
,加上这个参数,表示强制刷新依赖。
但是回到 AndroidStudio 写代码,发现代码提示中新的 API 还是没有出来。看来是 Android Studio 没有更新。不过没关系,这事我也有经验。点开右边的 Gradle 面板,找到 androidDependencies
任务,右键,Create xxxxx Configuration
,然后在弹出的面板的 Arguments 一栏中输入前面提到的参数 --refresh-dependencies
,添加完,在运行那里选择它执行。
原来是在 .idea/libraries 里会记录每一个第三方库的 classes, javadoc 以及 sources 所对应的路径。其中 classes 对应的正是前面所提到的 transforms-1 里的目录,同样也正如前面所说,其中包含的路径是有 hash 值的,更新了依赖之后,hash 值不同,新的缓存路径也就不同了,而这里还是用的原来被删的那个路径,找不到对应的文件当然编辑器里就提示 cannot resolve symbol
了。所以正确而直接的解决方案应该是删除 .idea/libraries/
里对应该第三方库的 xml 文件让它重新生成,或者是直接修改该 xml 文件的内容,改为更新依赖之后的路径。