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开始AppCompatImageView
和AppCompatImageButton
错误地覆盖了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'
有两个选项:
- 你有没有更改支持库版本? 当资源有时不是用相同的名字“保存”的时候,这是相当经典的图书馆问题。 它不是你,它的谷歌。 尝试使用支持库25,并看看是否仍然发生此错误。
- 尝试清理项目并重build。 也许你在build文件夹中保留了一些旧的库版本,当你build立你的项目时,它会从中取得旧的值。