java.lang.NoClassDefFoundError:android / graphics / drawable / Icon

到目前为止,我只有一个用户使用rooted手机(SM-G900R7 Android 4.4.2)的错误。 错误是这样的:

Fatal Exception: java.lang.NoClassDefFoundError: android/graphics/drawable/Icon at java.lang.Class.getDeclaredMethods(Class.java) at java.lang.Class.getDeclaredMethods(Class.java:656) at android.view.ViewDebug.getExportedPropertyMethods(ViewDebug.java:960) at android.view.ViewDebug.exportMethods(ViewDebug.java:1047) at android.view.ViewDebug.dumpViewProperties(ViewDebug.java:997) at android.view.ViewDebug.dumpViewProperties(ViewDebug.java:983) at android.view.ViewDebug.dumpView(ViewDebug.java:900) at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:870) at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867) at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867) at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867) at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867) at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867) at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867) at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867) at android.view.ViewDebug.dump(ViewDebug.java:793) at android.view.ViewDebug.dispatchCommand(ViewDebug.java:416) at android.view.ViewRootImpl$W.executeCommand(ViewRootImpl.java:6258) at android.view.IWindow$Stub.onTransact(IWindow.java:65) at android.os.Binder.execTransact(Binder.java:404) at dalvik.system.NativeStart.run(NativeStart.java) 

我从来没有在我的代码中使用android.graphics.drawable.Icon,所有用法都来自android.support.v4.graphics.drawable.IconCompat ,我也从来没有在我的代码中使用该类…

顺便说一句,我的支持库是version 26.0.0, my minSdkVersion is 15 targetSdkVersion is 26.

谢谢

更新

该问题已在支持库27.0.0中修复。 如果你更新,不要忘了改变compileSdkVersion 27

发生什么事?

带有Android 4.4的三星设备在类扩展View定义了这样的方法,它返回或接受不在类path上的types的参数。

从支持库版本25.4.0开始AppCompatImageViewAppCompatImageButton错误地覆盖了setImageIcon(Icon)方法。 由于Icon类是在API 23中引入的,因此应用程序在使用API​​ 19的三星设备上崩溃。

当您尝试重写View.onApplyWindowInsets(WindowInsets)时,会发生类似的事情。

解决方法

在官方修正之前,我做了一个修改版本的appcompat-v7 ,其中删除了setImageIcon方法的所有痕迹。 这意味着它不会在三星Android 4.4上崩溃。

把它放在应用程序build.gradle的底部:

 repositories { maven { url "https://dl.bintray.com/consp1racy/maven" } } configurations.all { resolutionStrategy.eachDependency { details -> def requested = details.requested if (requested.group == 'com.android.support' && requested.name == 'appcompat-v7') { details.useTarget 'net.xpece.android:support-appcompat-v7-fixed:26.1.0-1' } } } 

此代码将用所描述的修改后的工件replaceappcompat-v7依赖项。

目前该修补程序唯一受支持的版本是26.1.0。

警告:在复制粘贴之前了解代码,并且在从不明来源获取代码时要格外小心!

此问题已在支持库27.0.0中解决 :

Android Gradle插件3.x:

 implementation 'com.android.support:appcompat-v7:27.0.0' implementation 'com.android.support:support-v4:27.0.0' 

Android Gradle插件2.x:

 compile 'com.android.support:appcompat-v7:27.0.0' compile 'com.android.support:support-v4:27.0.0' 

请注意,您还需要针对SDK级别27进行编译。

这个崩溃与25.4.0版本的支持库有关。

使用25.3.1版本。

更换

 compile 'com.android.support:appcompat-v7:25.4.0' compile 'com.android.support:support-v4:25.4.0' 

附:

 compile 'com.android.support:appcompat-v7:25.3.1' compile 'com.android.support:support-v4:25.3.1' 

有两个选项:

  1. 你有没有更改支持库版本? 当资源有时不是用相同的名字“保存”的时候,这是相当经典的图书馆问题。 它不是你,它的谷歌。 尝试使用支持库25,并看看是否仍然发生此错误。
  2. 尝试清理项目并重build。 也许你在build文件夹中保留了一些旧的库版本,当你build立你的项目时,它会从中取得旧的值。