如何使用 gradle 管理 3rd 方 deps 的不同支持库版本?

How to manage different support library versions for 3rd party deps with gradle?

我有一堆第三方库包含在我的基础应用程序中。我无法控制那些第 3 方模块包含的支持库。这使得我的应用程序中很难有相同版本的 android 支持库。

我知道使用 gradle 可以从每个依赖项中排除某些库:

compile('com.test:lib1:1.0.0') {
    exclude group: 'com.android.support'
}

然而,有大量的支持库,将它们全部排除在我的第 3 方库中似乎有点过分了。

有没有更好的方法?

阅读此博客post:https://www.devsbedevin.net/android-understanding-gradle-dependencies-and-resolving-conflicts/

建议:

configurations.all {
  resolutionStrategy {
    preferProjectModules()
  }
}

然而,当我使用它时,我的 gradle 文件中的 Android Studio 仍然收到警告,提示检测到多个版本的支持库。

如果我的依赖依赖于不同版本的支持库,我该怎么办?在上述任何一种情况下,我都会强制第 3 方库使用它们未构建的特定版本的支持库。我应该使用哪个版本?最新的支持库?所有第 3 方依赖项的最小支持库?

这是一个最小的 gradle 文件示例,显示了引入第 3 方依赖项,每个依赖项都依赖于他们自己的支持库版本。

android {
    compileSdkVersion 26
    buildToolsVersion '26.0.2'

    defaultConfig {
        applicationId "com.example.app"
        minSdkVersion 17
        targetSdkVersion 25
    }
}

configurations.all {
    resolutionStrategy {
        preferProjectModules()
    }
}

dependencies {
    compile 'com.android.support:support-v13:26.0.0'
    compile 'com.test:lib1:1.0' // depends on support-v13:25.0.0
    compile 'com.test:lib2:1.0' // depends on support-v13:25.2.0
    compile 'com.test:lib3:1.0' // depends on support-v13:25.4.0
    compile 'com.test:lib4:1.0' // depends on support-v13:26.0.0
}

Android 工作室发出以下警告:

第一种情况: 你有兼容的 libs 已经更新了他们自己的内部 libs,这里没问题。

第二种情况:你的项目中有libs,它的版本高于其他libs 包含在其他 libs 内部,这些 libs 可以更新到新版本而没有这样的问题,这里也没有问题。

最坏的情况: 你的项目中有比其他 libs 内部包含的其他 更高版本的库libs,而这些 libs 没有已经在内部更新的新版本 libs,建议的解决方案:

  1. 下载该库并将其包含到您的 app 作为 project implementation project(':library') 并更新其内部 .
  2. 或者改用其他库。

不要忘记使用 ./gradlew app:dependencies 检查您的依赖项。

我也相信应该有某种方式可以自动执行此操作。

您需要用您想要的版本指定依赖项,它会在需要它的库之前引起冲突。如果你这样做,这些库将使用你指定的依赖版本。

您的屏幕截图中的库示例(来自警告消息)

dependencies {
    compile 'com.android.support:support-v13:26.0.0'
    compile 'com.android.support:support-compat:26.0.0'
    compile 'com.android.support:animated-vector-drawable:26.0.0'
    compile 'com.test:lib1:1.0' // depends on support-v13:25.0.0
    compile 'com.test:lib2:1.0' // depends on support-v13:25.2.0
    compile 'com.test:lib3:1.0' // depends on support-v13:25.4.0
    compile 'com.test:lib4:1.0' // depends on support-v13:26.0.0
}

继续添加依赖项(显示在屏幕截图的警告中),直到不再有任何关于不同库版本的警告消息。

这当然是可能的。在您的项目 build.gradle 文件(顶级 build.gradle 文件)中添加以下代码块:

ext {
    supportlib_version = '26.1.0'
    gps_version = '11.2.0'
}

//Ensure that all dependencies use the same version of the Android Support library
subprojects {
    project.configurations.all {
        resolutionStrategy.eachDependency { details ->
            if (details.requested.group == 'com.android.support'
                    && !details.requested.name.contains('multidex')) {
                details.useVersion "$supportlib_version"
            }
            if (details.requested.group == 'com.google.android.gms'
                    && !details.requested.name.contains('multidex')) {
                details.useVersion "$gps_version"
            }
        }
    }
}

以下代码确保 'com.android.support' 依赖项版本对于所有依赖项都等于 $supportlib_version。 'com.google.android.gms' 框架也是如此。

确保在模块的 build.gradle 文件中也将这些版本用于依赖项。例如:

compile "com.android.support:support-v4:$supportlib_version"

阅读 Official Gradle documentation.

中有关强制执行特定依赖版本的更多信息

更新 Google has decoupled library versions。因此,强制使用高于 15.0.0 的特定版本可能不起作用。相反,您可以允许有限范围的版本。下面的示例允许任何高于 15.0.0 但低于 16 的版本。

gps_version = '[15.0.0, 16.0.0)'

制作 targetsdkversion 26 并且在你的 gradle 中更改为 26 或者你可以将你的 compilesdk 版本更改为 25 并将你的相关依赖项更改为 25