前言
在早期应用Eclipse IDE 作为开发工具的时候,包之间依赖冲突解决起来,比用studio IDE开发简单很多,只要重新修改build path中jar路径或者依赖路径就行,但是studio中包依赖规则较为灵活,保不齐出什么状况。
冲突场景:
多模块开发,旧版依赖升级过程中,以及从git上下载demo,冲突较多,这里简单搜集几个依赖导致build 失败例子:
除了code耗费时间外,解决依赖也需要花费不少时间!!
这里借鉴一些依赖原则
当工程中依赖了不同版本的同一个依赖库,重复依赖的库都是通过 gradle 网络依赖方式,那么 studio 会默认选择高版本。
但是如果既有本地依赖版本,又有网络依赖版本,结果就是引起重复依赖冲突。
解决方式:都走网络依赖
依赖报告检查
Terminal 终端面板里输入以下命令
//
XXX表示想打印的module的name
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'
}
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://www.jb51.cc/article/p-khbwimcy-qh.html