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
导致出现了上面的报错
解决方法和上面是一样的