欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

support 依赖的冲突的解决思路

程序员文章站 2022-07-12 22:30:52
...

前言

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

冲突场景:

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

support 依赖的冲突的解决思路

support 依赖的冲突的解决思路
support 依赖的冲突的解决思路

support 依赖的冲突的解决思路

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

这里借鉴一些依赖原则

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

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

解决方式:都走网络依赖

依赖报告检查

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

//

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

依赖报告示例如下:

support 依赖的冲突的解决思路

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 数量。

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

support 依赖的冲突的解决思路

support 依赖的冲突的解决思路

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

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

support 依赖的冲突的解决思路

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

相关标签: gradle 依赖