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

los*_*ion 40 android dependency-management gradle android-studio android-gradle-plugin

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

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

compile('com.test:lib1:1.0.0') {
    exclude group: 'com.android.support'
}
Run Code Online (Sandbox Code Playgroud)

然而,有大量的支持库,并将它们全部排除在我的第三方库的每一个看起来像是矫枉过正.

有没有更好的办法?

阅读这篇博文:https://www.devsbedevin.com/android-understanding-gradle-dependencies-and-resolving-conflicts/

它表明:

configurations.all {
  resolutionStrategy {
    preferProjectModules()
  }
}
Run Code Online (Sandbox Code Playgroud)

但是当使用它时,我仍然在我的gradle文件中的Android Studio中收到警告,检测到有多个版本的支持库.

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

这是一个最小的gradle文件示例,显示了第三方依赖项,每个依赖项依赖于它们自己的支持库版本.

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
}
Run Code Online (Sandbox Code Playgroud)

Android studio提供以下警告:

在此输入图像描述

Mdl*_*dlc 42

这当然是可能的.在您的项目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"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

compile "com.android.support:support-v4:$supportlib_version"
Run Code Online (Sandbox Code Playgroud)

阅读有关在官方Gradle文档中强制某个依赖项版本的更多信息.

更新 Google已将图书馆版本分离.因此,强制特定版本高于15.0.0可能无法正常工作.相反,您可以允许有限范围的版本.以下示例允许任何高于15.0.0但低于16的版本.

gps_version = '[15.0.0, 16.0.0)'
Run Code Online (Sandbox Code Playgroud)