Java.lang.NoClassDefFoundError: android/graphics/drawable/Icon 意思是找不到android.graphics.drawable.Icon类。

95

到目前为止,我只遇到了一个用户遇到了这个错误,他使用的是一部已经获取 root 权限的手机 (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。而且我也从未在我的代码中使用过那个类...

顺便提一下,我的支持库版本是26.0.0,我的minSdkVersion为15,targetSdkVersion为26。

谢谢


4
我也遇到了同样的问题。我的设备已经取得了root权限,使用的是相同的安卓系统版本。你找到解决方法了吗? - Chris
24
让我猜猜?你指的是运行Android 4操作系统的三星设备? - Noman Rafique
7
三星S5,4.4.2版本,已经取得root权限。 - Vaiden
2
我也遇到了同样的问题,通过 Crashlytics 报告了相同的设备。几乎每个新版本都会出现一次,而且几乎在发布后立即出现。我的应用程序具有 multidex。 - djxstream
6
谷歌问题追踪器:https://issuetracker.google.com/issues/63151548 - tabjsina
显示剩余14条评论
4个回答

40

更新

这个问题在支持库版本27.0.0中得到了修复。如果您更新,请不要忘记将compileSdkVersion更改为27。

发生了什么?

安卓4.4的三星设备会在继承View类并定义返回或接受不在classpath上的类型的方法时崩溃。

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

如果您尝试覆盖View.onApplyWindowInsets(WindowInsets),也会发生类似的情况。

支持库26.1.0的解决方法

在官方方式修复此问题之前,如果您被困在旧版支持库中,我制作了一个修改过的appcompat-v7版本,其中所有的setImageIcon方法都已被删除。这意味着在安卓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'
        }
    }
}

这段代码将用修改后的构件替换 appcompat-v7 依赖。

目前唯一支持的修复版本是 26.1.0。

警告:在复制粘贴代码之前理解代码,并且在从未知来源获取代码时始终要小心!


2
@Dika 不用担心,这个问题应该会在下一个版本中得到修复。 - Eugen Pechanec
我正在使用26.0.2版本,出现了崩溃的情况。你的修复方法可以在该版本上运行吗? - Chisko
1
@Chisko 不要使用多个不同版本的支持库。我认为你可以安全地将所有支持库更新到26.1.0。修复程序仅针对该版本发布。 - Eugen Pechanec
1
{btsdaf} - Eugen Pechanec
1
@Alex,我刚刚查看了AppCompat 27.0.0的源代码,一切都是正确的。有两种可能:1)你仍在使用旧的支持库。检查你的已解决依赖项。 2)同样的异常在其他地方被抛出,因为是不同的类。你能分享崩溃报告或堆栈跟踪吗?我会进一步研究它。 - Eugen Pechanec
显示剩余7条评论

14

这个问题已经在支持库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级别。


1
这个崩溃与25.4.0版本的支持库有关。 请使用25.3.1版本。 替换。
compile 'com.android.support:appcompat-v7:25.4.0'
compile 'com.android.support:support-v4:25.4.0'

With:

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

值得注意的是,这将锁定您的compileSdkVersion 25,无法使用Android O API以及自25.4.0后引入的支持库功能(例如着色图像视图可绘制和矢量路径变形后端)。这是支持库的变更日志https://developer.android.com/topic/libraries/support-library/revisions.html。 - Eugen Pechanec

-1

有两个选项:

  1. 您是否更改了支持库版本?这是一个经典的库问题,有时资源没有以相同的名称保存,或者根本没有保存。这不是您的问题,而是谷歌的问题。尝试使用支持库25,看看是否仍然出现此错误。
  2. 尝试清理项目并重新构建。也许您在构建文件夹中保留了一些旧的库版本,当您构建项目时,它会从中获取旧值。

1
感谢您的回答。对于第二个问题,我已经多次进行了完整的Gradle清理。对于第一个问题,我的targetSdkVersion是26,如果不针对最新的API进行目标设置,Android Studio会显示警告;如果我使用比targetSdkVersion更旧的支持库版本,Android Studio也会显示错误。 - cn123h
1
更新到SDK 26后仍然存在相同的问题。 - amouly
你使用的支持库版本是哪个? - Sufian
@amouly,你的支持库版本是多少? - Sufian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接