不要在 Gradle 中使用来自传递依赖的更高版本的库

Don't use later library version from transitive dependency in Gradle

在我的 Android 项目中,我使用

compile 'com.squareup.okhttp:okhttp:2.2.0'

我需要 2.2.0 版的 okhttp 才能让我的代码正常工作。但是当我添加

时出现问题
compile('io.intercom.android:intercom-sdk:1.1.2@aar') {
        transitive = true
}

因为在 intercom-sdk 内部,对于更高版本再次存在 okhttp 依赖:

compile 'com.squareup.okhttp:okhttp:2.4.0'

结果是我的代码使用了更高版本的 2.4.0 而不是我想要的 2.2.0。请问有什么方法可以在我的模块中使用我指定的 2.2.0 并让对讲机使用它的 2.4.0 吗?

你可以这样使用:

compile('io.intercom.android:intercom-sdk:1.1.2@aar') {
    exclude group: 'com.squareup.okhttp', module: 'okhttp'
  }

不过要注意。如果库使用 2.2.0 版本中不存在的方法,它将失败。

您应该定义一个解析策略来设置特定的版本。这将保证您将获得所需的正确版本,无论传递依赖版本是什么:

allProjects {
   configurations.all {
       resolutionStrategy {
           eachDependency { DependencyResolveDetails details ->
               if (details.requested.name == 'okhttp') {
                   details.useTarget('com.squareup.okhttp:okhttp:2.2.0')
               }
            }
        }
     }
  }

在 Gradle 的较新版本中,您可以使用:

allProjects {
   configurations.all {
       resolutionStrategy.force 'com.squareup.okhttp:okhttp:2.2.0'
     }
 }