support 中v4、v7库版本错误详解

1,676 阅读1分钟

由于supportv4v7库版本不一致,可能会引起一下错误。

错误信息

java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v4/animation/AnimatorCompatHelper; at android.support.v7.widget.DefaultItemAnimator.resetAnimation(DefaultItemAnimator.java:515) at android.support.v7.widget.DefaultItemAnimator.animateMove(DefaultItemAnimator.java:255) at android.support.v7.widget.SimpleItemAnimator.animatePersistence(SimpleItemAnimator.java:126) at android.support.v7.widget.RecyclerView$4.processPersistent(RecyclerView.java:536) at android.support.v7.widget.ViewInfoStore.process(ViewInfoStore.java:241) at android.support.v7.widget.RecyclerView.dispatchLayoutStep3(RecyclerView.java:3653) at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3323) at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3844) 2018-10-10 10:08:39.478 7341-7341/com.hzy.test E/AndroidRuntime: Caused by: java.lang.ClassNotFoundException: Didn't find class "android.support.v4.animation.AnimatorCompatHelper" on path: DexPathList[[zip file "/data/app/com.hzy.test-2/base.apk"],nativeLibraryDirectories=[/data/app/com.hzy.test-2/lib/arm64, /data/app/com.hzy.test-2/base.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) at java.lang.ClassLoader.loadClass(ClassLoader.java:380) at java.lang.ClassLoader.loadClass(ClassLoader.java:312) ... 56 more

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

原因

因为某个模块的不同版本同时被依赖时,默认使用新版本,gradle同步时不会报错。但在运行时就会报错。

查看库的依赖树

要解决问题,就要找到哪个库使用了对应的版本库,可以使用如下命令查看。

gradlew :app:dependencies

解决

针对以上问题,可以有如下解决方法:

1. 排除依赖中的指定包

implementation ('com.yanzhenjie:recyclerview-swipe:1.1.4') {
    exclude group: 'com.android.support'
}

2. 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'
           }
       }
   }
}

如果以上方法不能解决您的问题,你可以联系我。






About Me