support中v4 v7库版本错误详解

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

第一种

错误信息:

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

java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v4/animation/AnimatorCompatHelper;
  • 1
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)
  • 1
  • 2

经过这两次错误的分析,总结出一个规律,凡是出现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'
    }
  • 1
  • 2
  • 3

第二种:

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

configurations.all {
    resolutionStrategy {
        force 'com.android.support:support-v4:24.1.0'
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5

或者

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'
           }
       }
   }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

第二种

错误信息

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

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

主要意思是在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 
这里写图片描述

导致出现了上面的报错

解决

解决方法和上面是一样的

你可能感兴趣的:(android,技术点)