support 依赖的冲突的解决思路
前言在早期应用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 两种情况的解决方案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要高 设置minSdkVersion大于16
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |