java.lang.NoClassDefFoundError: android / графика / вытяжка / значок


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. Вы нашли решение?
Крис

24
Дай угадаю? Устройства Samsung под управлением Android 4?
Noman Rafique

7
@NomanRafique Samsung S5, 4.4.2, рутирован.
Vaiden 03

2
Я испытываю то же самое, о том же устройстве сообщается через crashlyitcs. По одному экземпляру почти в каждой новой версии и практически сразу после публикации. В моем приложении есть multidex.
djxstream 07

Ответы:


40

Обновить

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

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

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

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

То же самое происходит, когда вы пытаетесь переопределить View.onApplyWindowInsets(WindowInsets).

Обходной путь для библиотеки поддержки 26.1.0

Пока это не будет исправлено официальным образом. Если вы застряли в более старой версии библиотеки поддержки, я сделал модифицированную версию, в 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.

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


что произойдет в будущем, если я должен обновить библиотеку поддержки до> 26.1.0? Думаю, твое исправление устареет, верно?
Дика

2
@Dika Не волнуйся, в следующем выпуске это исправят.
Eugen Pechanec

1
@Chisko Не используйте несколько версий разных библиотек поддержки. Думаю, вы можете смело обновить все свои вспомогательные библиотеки до 26.1.0. Исправление выпущено только для этой версии.
Eugen Pechanec

1
@ Чиско, это просто сила привычки. Многие люди не знают, что библиотеки поддержки связаны между собой и могут дать сбой при использовании разных версий. Просто убедитесь, что вы делаете :)
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, никаких API-интерфейсов Android O и функций библиотеки поддержки, представленных с 25.4.0 (например, тонирование изображений для просмотра изображений и обратный порт морфинга векторных путей). Вот
Евгений

-1

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

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

1
спасибо за ответ, за 2. Я много раз делал полную очистку градиента. для 1. мой targetSdkVersion равен 26, Android Studio показывает предупреждение, если не нацелен на новейший API, а Android Studio также показывает ошибку, если я использую более старую версию поддержки lib, чем targetSdkVersion.
cn123h 09

1
Та же проблема после обновления до SDK 26.
Amouly

@ cn123h какую версию библиотеки поддержки вы используете?
Суфиан

@amouly, а ваша версия библиотеки поддержки?
Суфиан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.