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


95

到目前为止,我仅针对使用根电话(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.

谢谢


4
对我来说也是一样。相同的植根设备,相同的android版本。您找到解决方案了吗?
克里斯(Chris)

24
让我猜猜?运行Android 4的三星设备?
Noman Rafique

7
@ NomanRafique三星S5,4.4.2,扎根。
Vaiden

2
我正在经历同一件事,通过crashlyitcs报告的同一设备。一个实例几乎是每个新版本,并且几乎在发布后立即出现。我的应用程序具有multidex。
djxstream

Answers:


40

更新资料

此问题已在支持库27.0.0中修复。如果您进行更新,请不要忘记进行更改compileSdkVersion 27

怎么了?

当类扩展View定义的方法返回或接受不在类路径上的类型的参数时,具有Android 4.4的三星设备会像这样崩溃。

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

当您尝试覆盖时也会发生类似的情况View.onApplyWindowInsets(WindowInsets)

支持库26.1.0的解决方法

在正式解决此问题之前,如果您对支持库的较旧版本感到困惑,那么我将修改后的版本删除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'
        }
    }
}

该代码将appcompat-v7用所描述的修改后的工件替换依赖性。

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

警告:复制粘贴之前请先了解代码,从未知来源获取代码时请务必小心!


如果我必须将支持库更新到> 26.1.0,将来会发生什么?我认为您的解决方案将过时,对吗?
迪卡

2
@Dika不用担心,应该在下一发行版中对其进行修复。
Eugen Pechanec

1
@Chisko不要使用不同支持库的多个版本。我认为您可以安全地将所有支持库更新到26.1.0。该修补程序仅针对该版本发布。
Eugen Pechanec

1
@Chisko只是习惯的力量。许多人不知道支持库是相互连接的,如果使用不同的版本,则可能会崩溃。只要确保您会做:)
Eugen Pechanec

1
@Alex我刚刚查看了AppCompat 27.0.0的源代码,它是正确的。两种选择:1)以某种方式您仍在使用旧的支持库。检查您已解决的依赖性。2)由于类不同,其他地方也会抛出相同的异常。您可以共享崩溃报告或堆栈跟踪信息吗?我会调查一下。
Eugen Pechanec

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'

带有:

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

值得一提的是,这将您锁定为compileSdkVersion 25,从25.4.0 开始,没有Android O API且没有引入支持库功能(例如,为图像视图可绘制对象着色和矢量路径变形反向)。下面是支持库的changelog developer.android.com/topic/libraries/support-library/...
尤金Pechanec

-1

有2个选项:

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

1
谢谢您的回答。2。我做了很多次完整的说明。对于1.。我的targetSdkVersion为26,如果未使用最新的API,则Android Studio会显示警告,如果我使用比targetSdkVersion更旧的支持lib,Android Studio也会显示错误。
cn123h

1
更新到SDK 26后,同样的问题
。–

@ cn123h您正在使用哪个版本的支持库?
苏菲安

@amouly,您的支持库版本是?
苏菲安
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.