support库中v4 v7版本冲突错误详解

support中v4 v7库版本错误,主要会报以下两种错误,下面针对每一种错误进行详解

第一种

错误信息:

先来看两个崩溃信息,如下:

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)
	

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

分析:

以第一种错误为例,进行分析

log显示,找不到v4库下的这个类,但是我发现在support-v4-24.1.0中可以找到这个类,又想到在build.gradle中看到的这样一个提示,

这里写图片描述

我猜想,难道是在运行的时候,使用的不是support-v4-24.1.0的库,使用了其他版本的库???

原因:

经过一番查找,和最后实践证明,确实是使用了26.0.0-alpha1版本的库(Support Repo 47.0.0 包括26.0.0-alpha1),在26.0.0-alpha1版本的库中确实没有AnimatorCompatHelper类。

因为某个模块的不同版本同时被依赖时,默认使用新版,gradle同步时不会报错。所以这里24.1.0版本的库被自动替换为了26.0.0-alpha1版本的库

要解决问题,就要找到哪个库使用了26.0.0-alpha1,使用命令gradlew :app:dependencies查看库的依赖树,发现**compile ‘com.mcxiaoke.viewpagerindicator:library:2.4.1’**使用了动态版本

这里写图片描述

解决:

找到了原因,那么解决起来就有头绪了
网上有人说,删除掉compile ‘com.android.support:support-v4:+’,也算是一种方法吧。像上面这种依赖在第三方库中,就需要下面的方法

第一种:

排除依赖中的指定包

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

第二种:

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

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

或者

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

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

第二种

##错误信息

gradle 4.+版本才会出现的错误

Android dependency 'com.android.support:support-compat' has different version for the compile (25.1.0) and runtime (25.3.0) classpath

主要意思是在compile和runtime 时使用的support库版本不一样

分析

compile 是runtime 的一部分。 例如,假设一个名为app程序使用库foo,而库foo在内部使用库bar。 编译应用程序app只需要foo库,但是运行app时需要foo和bar。 对Gradle compile的配置在其runtime 配置中也是可见的,但相反则不是这样。

原因:

因为某个库的不同版本同时被依赖时,默认使用较新版。

使用命令gradlew :app:dependencies查看库的依赖树,

在compile 时,看不到库mvp中依赖的support 版本,所以google play 相关的库使用support-v4:24.0.0的版本。下面之所以看不到mvp库中的依赖,是因为在引用第三方库使用了implementation(gradle 4.+版本才出现的新特性。详情可参考这里

这里写图片描述

在runtime时,运行了库mvp中,其中依赖的support 版本为support-v4:25.1.0,

这里写图片描述

所以google play 相关的库使用support的较新版本25.1.0
这里写图片描述

导致出现了上面的报错

解决

第一种:

解决方法和上面是一样的

第二种:

在lib中使用api依赖第三方库A,这样在module中也可以使用库A里面的相关类

dependencies {
	api xxxxxx
}

终极解决:

将项目迁移至AndroidX(推荐)
以后的趋势肯定是往AndroidX的方向发展的,官方对这个更新的速度很快,足见其重视性
迁移方法看官方文档即可,比较简单:迁移至AndroidX

参考:
java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v4/animation/AnimatorCompatHe

Alpha support library version overriding previous support libs versions

All com.android.support libraries must use the exact same version specification

执行代码 loadMoreEnd()报错

Android Support Repo 46.0.0 with Android Studio 2.3

Difference between compile and runtime configurations in Gradle

展开阅读全文
©️2020 CSDN 皮肤主题: 撸撸猫 设计师: 设计师小姐姐 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值