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

До сих пор я получил эту ошибку только для одного пользователя, который использует встроенный телефон (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, и я также никогда не использую этот класс в своем коде...

Btw моя библиотека поддержки version 26.0.0, my minSdkVersion is 15 targetSdkVersion is 26.

Спасибо

Ответ 1

Update

Проблема исправлена ​​в библиотеке поддержки 27.0.0. Если вы обновляете, не забудьте также изменить compileSdkVersion 27.

Что происходит?

Samsung устройства с Android 4.4 сбой, как это, когда классы, расширяющие View, определяют методы, которые возвращают или принимают параметры типов, которые не относятся к пути к классам.

Начиная с версии библиотеки поддержки версии 25.4.0 AppCompatImageView и AppCompatImageButton неправильно переопределяет метод setImageIcon(Icon). Поскольку в API 23 был введен класс Icon, приложение вылетает на устройствах Samsung с API 19.

Подобное происходит, когда вы пытаетесь переопределить View.onApplyWindowInsets(WindowInsets).

Обход

Пока это не будет исправлено официальным образом, я сделал модифицированную версию appcompat-v7, где все следы методов setImageIcon удалены. Это означает, что он не потерпит крах на Samsung с 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.

Предупреждение: Понимайте код перед копированием и всегда проявляйте осторожность при получении кода из неизвестных источников!

Ответ 2

Эта проблема была решена в библиотеке поддержки 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'

Обратите внимание, что вам также нужно будет скомпилировать с уровня 27 SDK.

Ответ 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'

Ответ 4

Есть 2 варианта:

  • Вы изменили версию библиотеки поддержки? это довольно классическая проблема с библиотекой, когда ресурсы иногда не "сохраняются" с тем же именем или вообще. Это не вы, его google. Попробуйте использовать поддержку lib 25 и посмотрите, не по-прежнему ли эта ошибка.
  • Попробуйте очистить проект и перестроить. Возможно, вы сохранили некоторые старые версии библиотеки в своей папке сборки, а когда вы строите проект, из нее берутся старые значения.