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

Posted

技术标签:

【中文标题】java.lang.NoClassDefFoundError: android/graphics/drawable/Icon【英文标题】: 【发布时间】:2018-01-16 20:33:21 【问题描述】:

到目前为止,我只为一位使用有根手机 (SM-G900R7 android 4.4.2) 的用户收到此错误。错误是这样的:

Fatal Exception: 
       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.

谢谢

【问题讨论】:

对我来说同样的问题。相同的root设备,相同的android版本。你找到解决办法了吗? 让我猜猜?运行 Android 4 的三星设备? @NomanRafique Samsung S5, 4.4.2, 已root。 我遇到了同样的事情,同样的设备通过 crashlyitcs 报告。几乎每个新版本都有一个实例,并且几乎在发布后立即出现。我的应用有 multidex。 谷歌问题跟踪器:issuetracker.google.com/issues/63151548 【参考方案1】:

更新

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

发生了什么?

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

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

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

支持库 26.1.0 的解决方法

直到以官方方式修复此问题,被删除。这意味着它不会在搭载 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,将来会发生什么?我认为您的修复将过时,对吧? @Dika 不用担心,它应该在下一个版本中修复。 @Chisko 不要使用不同支持库的多个版本。我认为您可以安全地将所有支持库更新到 26.1.0。该修复程序仅针对该一个版本发布。 @Chisko 这只是习惯的力量。很多人不知道支持库是相互关联的,如果使用不同的版本可能会崩溃。只要确保你这样做:) @Alex 我刚刚浏览了 AppCompat 27.0.0 的源代码,它是正确的。两种选择:1)不知何故,您仍在使用较旧的支持库。 Check your resolved dependencies. 2) 由于不同的类,在其他地方引发了相同的异常。您可以分享崩溃报告或堆栈跟踪吗?我会调查的。【参考方案2】:

This issue was resolved 在支持库 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 进行编译。

【讨论】:

【参考方案3】:

此崩溃与 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 和支持库功能(例如着色图像视图可绘制对象和矢量路径变形向后移植)。这是支持库更新日志developer.android.com/topic/libraries/support-library/…【参考方案4】:

有两种选择:

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

【讨论】:

感谢您的回答,对于 2。我做了很多次完整的 gradle clear。 1. 我的 targetSdkVersion 是 26,如果不是针对最新的 API,Android Studio 会显示警告,如果我使用比 targetSdkVersion 更旧版本的支持库,Android Studio 也会显示错误。 更新到 SDK 26 后出现同样的问题。 @cn123h 你用的是哪个版本的支持库? @amouly 你的支持库版本是?

以上是关于java.lang.NoClassDefFoundError: android/graphics/drawable/Icon的主要内容,如果未能解决你的问题,请参考以下文章