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

Android 如何使用gradle为第三方DEP管理不同的支持库版本?,android,android-studio,gradle,android-gradle-plugin,dependency-management,Android,Android Studio,Gradle,Android Gradle Plugin,Dependency Management,我在我的基础应用程序中包含了一堆第三方LIB。我无法控制这些第三方模块包含的支持库。这使得我的应用程序中很难有相同版本的android支持库 我知道使用gradle可以从每个依赖项中排除某些库: compile('com.test:lib1:1.0.0') { exclude group: 'com.android.support' } 然而,有大量的支持库,将它们全部排除在我的每一个第三方库之外似乎有些过头了 有更好的办法吗 阅读这篇博文: 它建议: configurations.a

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

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

compile('com.test:lib1:1.0.0') {
    exclude group: 'com.android.support'
}
然而,有大量的支持库,将它们全部排除在我的每一个第三方库之外似乎有些过头了

有更好的办法吗

阅读这篇博文:

它建议:

configurations.all {
  resolutionStrategy {
    preferProjectModules()
  }
}
然而,当使用它时,我在我的gradle文件中的androidstudio中仍然得到一个警告,即检测到支持库的多个版本

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

下面是一个最小的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
}
Android studio发出以下警告:


第一种情况:您的兼容库已经更新了自己的内部库,这里没有问题

第二种情况:您的项目中的lib版本高于其他lib内部包含的其他lib,并且这些lib可以更新为新版本而不会出现此类问题,这里也没有问题

最坏情况:项目中的LIB版本高于其他LIB内部包含的其他LIB,并且这些LIB没有更新内部LIB的新版本,建议解决方案如下:

  • 下载该库并将其作为项目
    实施项目(“:library”)
    包含到应用程序中,并更新其内部库
  • 或者改用其他库

  • 不要忘记使用
    /gradlew app:dependencies
    检查依赖项


    我还认为应该有某种方法可以自动做到这一点。

    您需要使用所需的版本指定导致冲突的依赖项,而不是需要它的LIB。如果这样做,这些库将使用指定的依赖项版本

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

    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_版本。“com.google.android.gms”框架也是如此

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

    compile "com.android.support:support-v4:$supportlib_version"
    
    阅读有关在中强制使用某个依赖项版本的更多信息

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

    gps_version = '[15.0.0, 16.0.0)'
    

    targetsdkversion
    26
    和gradle更改为26,或者您可以将compilesdk版本更改为
    25
    ,并将相关依赖项更改为25

    请提供build.gradle和依赖项树。如果我依赖lib1和lib2,是否有帮助。lib1支持v13:25.2.0,lib2支持v13:25.4.0。那么唯一的解决方案就是在本地下载lib1并将其支持库的版本更新为25.4.0?这么多不同的lib依赖于不同版本的支持库,为什么还要在那个时候使用中央回购?@lostintranslation只有在lib 1本身没有更高版本的情况下才会这样做。
    许多不同的lib依赖于不同版本的支持库
    我不这么认为。哈,你在开玩笑吗?您的意思是,所有创建库的开发人员都始终依赖于同一版本的支持库?不可能。我可以找到30个依赖于旧版本支持库的开源项目。当然,但我有20个依赖项,它们并不总是将项目更新到最新的支持库。假设其中一个依赖项使用支持库:25.4.0,所有其他依赖项使用25.2.0。你是说我应该把所有其他19个项目都放到本地,并将它们的支持库更新到25.4.0版。为什么还要在那个时候使用中央回购呢。一定有更好的方法。当然,但如果生成依赖项的支持库版本与我正在使用的支持库不兼容怎么办。看起来很危险。refereprojectmodules()不是做了同样的事情吗?@lostintranslation显然,如果覆盖依赖项的支持库版本,则可能会出现兼容性问题。但是在一个项目中使用一个支持库的多个版本,这也可能会加载到bug中。由于使用高支持库版本可以解决前者(因为较新版本向后兼容),因此我建议使用前者。这个答案节省了我的时间:请重新阅读问题,而不是我要问的问题。在您的回答中,android studio仍将警告您支持库的多个不同版本。我回答了您的一个问题,即:然而,有大量支持库,并且将它们全部排除在我的每个第三方库之外似乎有些过分。有更好的方法吗?@lostintranslation我创建了一个新项目来确认我的答案是正确的,我建议你也这样做。我做了gra