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. Ви знайшли рішення?
Кріс,

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

7
@NomanRafique Samsung S5, 4.4.2, кореневий.
Vaiden

2
Я відчуваю те саме, той самий пристрій повідомляється через crashlyitcs. Один примірник майже кожної нової версії, і майже відразу після публікації. Мій додаток має мультидекс.
djxstream

Відповіді:


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 Не хвилюйтеся, це слід виправити в наступному випуску.
Євген Печанець

1
@Chisko Не використовуйте кілька версій різних бібліотек підтримки. Я думаю, ви можете безпечно оновити всі свої бібліотеки підтримки до 26.1.0. Виправлення випущено лише для цієї однієї версії.
Євген Печанець

1
@Chisko це просто сила звички. Багато людей не знають, що бібліотеки підтримки взаємопов’язані та можуть зірватися, якщо використовувати різні версії. Просто переконайтесь, що ви це робите :)
Євген Печанець

1
@Alex Я щойно переглянув джерело AppCompat 27.0.0, і це правильно. Два варіанти: 1) Якимось чином ви все ще використовуєте стару бібліотеку підтримки. Перевірте свої вирішені залежності. 2) Той самий виняток кидається в іншому місці і через інший клас. Чи можете ви поділитися звітом про збій або трасуванням стека? Я розгляну це.
Євген Печанець

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'

Зауважте, що вам також потрібно буде скомпілювати з 27-го рівня SDK.


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 API для Android та жодних функцій бібліотеки підтримки, представлених з 25.4.0 (наприклад, тонування кольорових зображень у вигляді зображень та перетворення векторного контуру на задній план). Ось журнал змін бібліотеки підтримки developer.android.com/topic/libraries/support-library/…
Eugen Pechanec

-1

Є 2 варіанти:

  1. Ви змінили версію бібліотеки підтримки? це цілком класичне питання бібліотеки, коли ресурси часом не `` зберігаються '' з однаковим ім'ям або взагалі. Це не ти, а Google. Спробуйте скористатися підтримкою lib 25 і перевірте, чи ця помилка все ще не виникає.
  2. Спробуйте очистити проект і відновити. Можливо, у вас є кілька старих версій бібліотеки у вашій папці збірки, і коли ви створюєте свій проект, він бере з нього старі значення.

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


@ cn123h, яку версію бібліотеки підтримки ви використовуєте?
Суфіан

@amouly, а ваша версія підтримки lib є?
Суфіан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.