Android:如何让Gradle指定依赖离线获取其余依赖在线获取?
解决Gradle部分依赖强制用本地缓存、其余依赖在线更新的问题
我之前也碰到过完全一样的需求:想让某些依赖直接用本地缓存(和离线模式一样快),但其他依赖还能正常从线上拉取最新版本。调缓存时长、设changing属性确实没达到预期效果,后来靠这几个方案搞定了,分享给你:
方案1:用依赖锁定(Dependency Locking)——最推荐的方式
这是Gradle官方提供的精准控制依赖版本的功能,能强制指定的依赖完全使用本地已缓存的版本,不会去线上做任何校验或更新请求,效率和离线模式一致,同时不影响其他依赖的在线更新。
步骤很简单:
- 首先在项目根目录的
settings.gradle里启用依赖锁定(Groovy示例):dependencyLocking { // 可以选择锁定所有配置,也可以只锁定特定配置(比如implementation) lockAllConfigurations() } - 先运行一次正常的Gradle Sync,确保你要锁定的依赖(比如support-v4)已经下载到本地缓存里。
- 执行命令生成锁定文件:
这会在每个模块的./gradlew dependencies --write-locksgradle/dependency-locks目录下生成对应配置的锁定文件,里面记录了依赖的精确版本和哈希值。 - 如果你只想锁定特定依赖(比如只锁support-v4),可以编辑生成的锁定文件,删掉其他不需要锁定的条目;或者更精准地在模块的
build.gradle里只给特定配置启用锁定:
这样设置后,被锁定的依赖会直接从本地缓存读取,完全不碰远程仓库,未锁定的依赖则正常拉取最新版。configurations { implementation { resolutionStrategy.activateDependencyLocking() } // 比如debugImplementation不启用锁定,依然可以在线更新 }
方案2:手动引用本地Jar包——极端场景备选
如果依赖锁定满足不了你的特殊需求,还可以直接把本地缓存里的依赖Jar包复制到项目里,作为本地依赖引用:
- 找到本地Gradle缓存中support-v4的Jar包,路径一般是
~/.gradle/caches/modules-2/files-2.1/com.android.support/support-v4/[你的版本号]/[哈希值]/support-v4-[版本号].jar - 把这个Jar包复制到项目的
libs目录(比如app/libs) - 在模块的
build.gradle里调整依赖配置:
这种方式完全不会去线上请求该依赖,但缺点是需要手动维护版本,不够灵活,适合临时应急。dependencies { // 先排除其他依赖里引入的线上support-v4 implementation('com.android.support:appcompat-v7:28.0.0') { exclude group: 'com.android.support', module: 'support-v4' } // 引用本地的support-v4 Jar包 implementation files('libs/support-v4-28.0.0.jar') }
方案3:自定义解析策略——精准控制单依赖
通过resolutionStrategy强制指定依赖的版本,并禁用远程检查:
configurations.all { resolutionStrategy.eachDependency { details -> // 匹配你要强制用缓存的依赖 if (details.requested.group == 'com.android.support' && details.requested.name == 'support-v4') { // 指定本地已缓存的版本 details.useVersion '28.0.0' details.because "Force use cached version to speed up sync" } } // 禁用该依赖的动态版本和变更模块缓存检查 resolutionStrategy.cacheChangingModulesFor 0, 'seconds' resolutionStrategy.cacheDynamicVersionsFor 0, 'seconds' }
注意:必须确保本地已经有这个版本的缓存,否则Gradle还是会尝试去线上下载。
总结
优先用依赖锁定,它既灵活又能精准控制,比手动复制Jar包好维护,也比单纯调缓存时长靠谱,完全能实现你要的“部分依赖离线、其余在线”的效果。
内容的提问来源于stack exchange,提问作者Hazem Madkour
相关产品推荐
相关产品推荐

