Android support包冲突

开发过程中往往会引入很多第三方的依赖,这些第三方组件库的质量和内部依赖是良莠不齐的,很多时候为了实现功能的快速开发和迭代,在项目中有可能会使用超过十几个或者几十个依赖库,这些依赖库中难免会存在合并冲突,简单的合并冲突可以通过配置manifest对应的冲突地方添加 "replace" 标签来解决,但是有一类问题是比较棘手的,那就是support包依赖冲突问题。

常见合并出错

Error:(87, 9) Execution failed for task ':App:processDebugManifest'.
Manifest merger failed : Attribute application@label value=(@string/app_label) from AndroidManifest.xml:87:9
is also present at ANDROID_APPLICATION:Library:unspecified:9:18 value=(@string/app_name)
Suggestion: add 'tools:replace="android:label"' to <application> element at AndroidManifest.xml:82:5 to override


support包冲突问题一般有两个类,一类是大的support包会包含小的support,这种可以通过删除小的support包来解决;还有一类是support包版本不一致,这种可以通过在App Modue内的build.gradle最底部添加configurations来解决。

常见依赖包不一致出错

Manifest merger failed : Attribute meta-data#android.support.VERSION@value value=(25.3.0) from [com.android.support:support-v13:25.3.0] AndroidManifest.xml:27:9-31 is also present at [com.android.support:preference-v7:26.0.0-alpha1] AndroidManifest.xml:24:9-38 value=(26.0.0-alpha1). Suggestion: add 'tools:replace="android:value"' to element at AndroidManifest.xml:25:5-27:34 to override.

常见依赖包不一致解决办法,在app module的build.gradle最底部添加如下configurations

configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        def requested = details.requested
        if (requested.group == 'com.android.support') {
            if (!requested.name.startsWith("multidex")) {
                details.useVersion '25.3.0'
            }
        }
    }
}

但是我最近遇到的是一个更为复杂的问题,就是依赖的多个第三方库项目中都已经有了support依赖,而且该依赖的版本还不一致,这个问题我最初以为是项目中的依赖和第三方库中的依赖冲突,便开始尝试删除项目中的依赖,因为最终都会通过gradle编译进App中,所以不管你被依赖的support在什么位置,最终都是能被引用到的,但是删除项目中的依赖以后,发现问题仍未解决,通过查看gradle console中的日志信息发现,我删除的虽然也会和新引入的冲突,但是根本的冲突在于我新引入的第三方库与原有的第三方库引用了一模一样的support包,只是版本不一致。

引入依赖包剔除所有三方库引入的support依赖

compile ('com.demo.third.libs'){
    exclude group:'com.android.support'
}

于是我就在想,既然原有的项目中已经完全包含了该新引入的三方库的所有support包,那我就可以在引入新的三方库的时候,剔除原有的support依赖,那样应该就能解决,于是我在新引入的三方库依赖代码后面添加了剔除依赖的代码,重新build后发现问题成功解决。

标签:gradle, support lib, android merger failed, 编译