我在离线模式下使用 gradle 时遇到问题: 当未选中离线时,我可以正常运行我的项目,然后,我需要离线工作(因为我正在乘坐火车),并且在不触及任何 gradle 文件的情况下,会抛出此错误:
> Could not resolve com.google.android.gms:play-services-basement:[15.0.1,16.0.0).
Required by:
project :app > com.google.android.gms:play-services-ads:15.0.1
project :app > com.google.android.gms:play-services-ads-lite:15.0.1
project :app > com.google.android.gms:play-services-gass:15.0.1
> No cached version listing for com.google.android.gms:play-services-basement:[15.0.1,16.0.0) available for offline mode.
为什么在上次在线同步期间没有缓存此依赖项?我怎样才能在没有任何互联网连接的情况下构建这个项目?
最佳答案
该问题可能与来自您的构建的多个更高级别依赖项隐式需要的 com.google.android.gms:play-services-basement
依赖项版本冲突有关 .gradle.
以下步骤介绍了如何诊断相同的问题,但具有 com.google.android.gms:play-services-ads-identifier
(在下面的示例中使用)依赖项。
以“app”为例,因此请用您的 app_module 的实际名称替换app。
先决条件(初始问题案例):
我的build.gradle具有以下内容:
...
implementation 'com.google.android.gms:play-services-ads:15.0.1'
implementation 'com.google.android.gms:play-services-analytics:17.0.0'
...
当未选择“离线工作”时,运行 Gradle 同步可以正常工作。但是一旦我打开离线工作,在 gradle 同步过程中就会弹出以下错误:
:app@debug/compileClasspath': Could not resolve com.google.android.gms:play-services-ads-identifier:[15.0.1,16.0.0).
Disable offline mode and sync project
Show Details
Affected Modules: app
...
诊断步骤:
- 打印所有引用 play-services-ads-identifier 依赖项的位置
./gradlew :app:dependencyInsight --configuration releaseRuntimeClasspath --dependency "com.google.android.gms:play-services-ads-identifier"
就我而言,在所有输出中我看到以下几行:
...
com.google.android.gms:play-services-ads-identifier:17.0.0
+--- com.google.android.gms:play-services-analytics-impl:17.0.0
| +--- com.google.android.gms:play-services-analytics:17.0.0 (requested com.google.android.gms:play-services-analytics-impl:[17.0.0])
| |
...
...
com.google.android.gms:play-services-ads-identifier:[15.0.1,16.0.0) -> 17.0.0
\--- com.google.android.gms:play-services-ads:15.0.1
+--- releaseRuntimeClasspath
...
线路
com.google.android.gms:play-services-ads-identifier:[15.0.1,16.0.0) -> 17.0.0
表示存在冲突,play-services-ads-identifier 的版本已解析为 17.0.0,而最初请求的是 15.0.1。
- 接下来最重要要注意的是play-services-ads-identifier的引用来源。这是在输出中依赖项名称后面的下一行中指定的,在我的具体情况下,这些源是
- com.google.android.gms:play-services-analytics-impl:17.0.0
- com.google.android.gms:play-services-ads:15.0.1
因为我知道这两个依赖项是我的顶级依赖项(即在 build.gradle 中明确指定)。现在我有以下选择来解决这个问题。
解决方案1
我可以避免版本冲突e。 G。通过升级
com.google.android.gms:play-services-ads:15.0.1
到 com.google.android.gms:play-services-ads:17.0.0
app 模块中的 build.gradle。这样做可以让 Gradle 在选择离线工作时成功同步。
解决方案2
保留依赖关系但排除冲突的模块。 IE。改变
implementation 'com.google.android.gms:play-services-ads:15.0.1'
到
implementation ('com.google.android.gms:play-services-ads:15.0.1') {
exclude group: 'com.google.android.gms', module: 'play-services-ads-identifier'
}
完成此操作后,我将面临更多同步错误,因为很少有底层依赖项存在冲突。结果,我将得到以下结果:
implementation ('com.google.android.gms:play-services-ads:15.0.1') {
exclude group: 'com.google.android.gms', module: 'play-services-ads-identifier'
exclude group: 'com.google.android.gms', module: 'play-services-base'
exclude group: 'com.google.android.gms', module: 'play-services-basement'
}
这使得 Gradle 也离线工作。
注意: 在您的情况下,可能会在上面显示的 dependencyInsight 命令的树状输出中更深入地找到导致冲突的源依赖项。
<小时/>我使用的环境:
macOS 上的 Android Studio v3.5.2、Gradle 插件 v3.5.2、Gradle v5.6.4
关于android - Gradle离线同步问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54792730/