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