如何使用 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,建议的解决方案:
- 下载该库并将其包含到您的 app 作为 project
implementation project(':library')
并更新其内部 库.
- 或者改用其他库。
不要忘记使用 ./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
我有一堆第三方库包含在我的基础应用程序中。我无法控制那些第 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,建议的解决方案:
- 下载该库并将其包含到您的 app 作为 project
implementation project(':library')
并更新其内部 库. - 或者改用其他库。
不要忘记使用 ./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