support 依赖的冲突的解决思路

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/o279642707/article/details/80447251

前言

在早期应用Eclipse IDE 作为开发工具的时候,包之间依赖冲突解决起来,比用studio IDE开发简单很多,只要重新修改build path中jar路径或者依赖路径就行,但是studio中包依赖规则较为灵活,保不齐出什么状况。

冲突场景:

多模块开发,旧版依赖升级过程中,以及从git上下载demo,冲突较多,这里简单搜集几个依赖导致build 失败例子:

这里写图片描述

这里写图片描述
这里写图片描述

这里写图片描述

除了code耗费时间外,解决依赖也需要花费不少时间!!

这里借鉴一些依赖原则

当工程中依赖了不同版本的同一个依赖库,重复依赖的库都是通过 gradle 网络依赖方式,那么 studio 会默认选择高版本。

但是如果既有本地依赖版本,又有网络依赖版本,结果就是引起重复依赖冲突。

解决方式:都走网络依赖

依赖报告检查

Terminal 终端面板里输入以下命令

//

 XXX表示想打印的modulename
gradle XXX:dependencies

依赖报告示例如下:

这里写图片描述

support-annotation 的顶级依赖是 -> 25.3.1,从这里可以看到至少三个版本的support-annotation,25.1.0,25.0.0,25.3.1
依赖报告中可以看到有些依赖标注了 *号,表示这个依赖被忽略了,这是因为其他顶级依赖中也依赖了这个传递的依赖, Gradle 会自动分析下载最合适的依赖。有些依赖形如25.1.0 ->25.3.1是由于默认会优先版本高的依赖.这个时候你想使用版本低的依赖的话需要排除掉高的依赖。

两种情况的解决方案

Studio 机制:
Studio 默认情况下会优先高版本的依赖库。

实际情况分为两种

第一种情况:如果 SDK 中的版本高于 APP 中的版本?

解决方式一:

去掉 SDK 中的低版本依赖,使用 SDK 中的新版本(这个过程可以是 Android Studio自动完成,无需改动)

解决方式二:

如果 App 中不想引用高版本的 包,而 Studio 中默认情况下会优先高版本的依赖库,这种情况下怎么办呢?需要手动处理排除依赖

compile('com.android.support:support-compat:25.1.0') {
       exclude module: 'com.android.support:support-annotations'
}

第二种情况:如果 SDK 中的版本小于 APP 中的版本?

很抱歉 APP 中的某些功能可能不正常。那么就需要进行版本统一处理,更改sdk中版本。或者降级app中依赖版本,当然统一升级到高版本也是可以

验证方法数

https://github.com/KeepSafe/dexcount-gradle-plugin 一款插件,统计jar包meths 数量。

验证不同的版本添加后对方法数的影响:

这里写图片描述

这里写图片描述

简单的一个实现,验证了对方法数是没有影响的,在两个版本中

java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v4/animation/AnimatorCompatHelper;

java.lang.NoSuchMethodError: No static method wrap(Ljava/lang/Object;)Landroid/support/v4/view/WindowInsetsCompat; in class Landroid/support/v4/view/WindowInsetsCompat; or its super classes (declaration of 'android.support.v4.view.WindowInsetsCompat' appears in /data/app/cn.xuexuan.newui-2/base.apk:classes12.dex)

在26.0.0-alpha1以上版本中没有AnimatorCompatHelper类。

经过这两次错误的分析,总结出一个规律,凡是出现Android/support/v4/中找不到类或者方法,可以确定是依赖了多个不同版本的support库,都可以使用下面介绍的方法来解决。

强制设置某个模块的版本

force强制设置某个模块的版本。

configurations.all {
    resolutionStrategy {
        force 'com.android.support:support-v4:24.1.0'
    }
}

com.android.support包名的库版本都是用24.1.0


dependencies {
  compile fileTree(include: ['*.jar'], dir: 'libs')
  ...
  configurations.all {
    resolutionStrategy.eachDependency { 
      DependencyResolveDetails details ->
        def requested = details.requested
          if (requested.group == 'com.android.support') {
            if (!requested.name.startsWith("multidex")) {
              details.useVersion '25.1.0'
            }
          }
    }
  }
}

另外一种方式排除依赖中的指定包

compile ('com.mcxiaoke.viewpagerindicator:library:25.1.0') {
  exclude group: 'com.android.support'
}

描述:APP模块中添加v427.0.2解决

Error:Execution failed for task ':app:preDebugBuild'.
> Android dependency 'com.android.support:support-v4' has different version for the compile (22.0.0) and runtime (27.0.2) classpath. You should manually set the same version via DependencyResolution

这里写图片描述

Manifest merger failed : uses-sdk:minSdkVersion 14 cannot be smaller than version 16 declared in library[com.android.support:design:27.0.2]

产生原因:

某个依赖包的manifests中的minSdkVersion版本比项目的minSdkVersion要高
解决方法:
1.更改项目的uses-sdk:minSdkVersion
2.更改依赖包的uses-sdk:minSdkVersion
3.在项目的manifests标签下添加

设置minSdkVersion大于16

https://www.jianshu.com/p/a492bf61c0e6
http://www.bubuko.com/infodetail-2027963.html
http://blog.csdn.net/p576518762/article/details/78320477
http://blog.csdn.net/xx326664162/article/details/71488551

猜你喜欢

转载自blog.csdn.net/o279642707/article/details/80447251