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

95

Jusqu'à présent, je n'ai eu cette erreur que pour un utilisateur, qui utilise un téléphone rooté (SM-G900R7 Android 4.4.2). L'erreur est comme ceci:

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)

Je n'utilise jamais android.graphics.drawable.Icon dans mon code, tous les usages proviennent android.support.v4.graphics.drawable.IconCompatet je n'utilise jamais non plus cette classe dans mon code ...

Btw ma bibliothèque de support est version 26.0.0, my minSdkVersion is 15 targetSdkVersion is 26.

Merci

cn123h
la source
4
Même problème pour moi. Même appareil enraciné, même version Android. Avez-vous trouvé une solution?
Chris
24
Laisse-moi deviner? Appareils Samsung fonctionnant sous Android 4?
Noman Rafique
7
@NomanRafique Samsung S5, 4.4.2, enraciné.
Vaiden
2
Je vis la même chose, le même appareil signalé via crashlyitcs. Une instance presque à chaque nouvelle version, et presque immédiatement après la publication. Mon application est multidex.
djxstream
6
suivi des problèmes google: issuetracker.google.com/issues/63151548
tabjsina

Réponses:

40

Mettre à jour

Le problème est résolu dans la bibliothèque de support 27.0.0. Si vous mettez à jour, n'oubliez pas de changer compileSdkVersion 27également.

Qu'est-ce qui se passe?

Les appareils Samsung équipés d'Android 4.4 plantent de cette manière lorsque les classes qui s'étendent Viewdéfinissent des méthodes qui renvoient ou prennent des paramètres de types qui ne sont pas sur le chemin de classe.

À partir de la version 25.4.0 de la bibliothèque de support AppCompatImageViewet AppCompatImageButtonremplace incorrectement la setImageIcon(Icon)méthode. Depuis que la Iconclasse a été introduite dans l'API 23, l'application se bloque sur les appareils Samsung avec l'API 19.

Une chose similaire se produit lorsque vous essayez de passer outre View.onApplyWindowInsets(WindowInsets).

Solution de contournement pour la bibliothèque de support 26.1.0

Jusqu'à ce que cela soit corrigé de manière officielle, si vous êtes coincé avec une version plus ancienne de la bibliothèque de support, j'ai créé une version modifiée appcompat-v7où toutes les traces de setImageIconméthodes sont supprimées. Cela signifie qu'il ne plantera pas sur un Samsung avec Android 4.4.

Mettez ceci au bas de la build.gradle de votre application:

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'
        }
    }
}

Ce code remplacera la appcompat-v7dépendance par l'artefact modifié décrit.

Actuellement, la seule version prise en charge du correctif est la 26.1.0.

Attention: comprenez le code avant de copier-coller et soyez toujours prudent lorsque vous récupérez du code provenant de sources inconnues!

Eugen Pechanec
la source
que se passera-t-il dans le futur si je dois mettre à jour la bibliothèque de support vers> 26.1.0? Je pense que votre solution sera obsolète, non?
Dika
2
@Dika Pas de soucis, cela devrait être corrigé dans la prochaine version.
Eugen Pechanec
1
@Chisko N'utilisez pas plusieurs versions de différentes bibliothèques de support. Je pense que vous pouvez mettre à jour en toute sécurité toutes vos bibliothèques de support vers 26.1.0. Le correctif n'est publié que pour cette version.
Eugen Pechanec
1
@Chisko, c'est juste la force de l'habitude. Beaucoup de gens ne savent pas que les bibliothèques de support sont interconnectées et peuvent se bloquer si différentes versions sont utilisées. Assurez-vous simplement que vous le faites :)
Eugen Pechanec
1
@Alex Je viens de passer par la source d'AppCompat 27.0.0 et c'est correct. Deux options: 1) D'une manière ou d'une autre, vous utilisez toujours une ancienne bibliothèque de support. Vérifiez vos dépendances résolues. 2) La même exception est lancée ailleurs et à cause d'une classe différente. Pouvez-vous partager le rapport de plantage ou la trace de pile? Je vais l'examiner.
Eugen Pechanec
14

Ce problème a été résolu dans la bibliothèque de support 27.0.0:

Plugin Android Gradle 3.x:

implementation 'com.android.support:appcompat-v7:27.0.0'
implementation 'com.android.support:support-v4:27.0.0'

Plugin Android Gradle 2.x:

compile 'com.android.support:appcompat-v7:27.0.0'
compile 'com.android.support:support-v4:27.0.0'

Notez que vous devrez également compiler avec le niveau 27 du SDK.

Paul Lammertsma
la source
1

Ce plantage était lié à la version 25.4.0 de la bibliothèque de support.

Utilisez la version 25.3.1 .

Remplacer

compile 'com.android.support:appcompat-v7:25.4.0'
compile 'com.android.support:support-v4:25.4.0'

Avec:

compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support:support-v4:25.3.1'
phnmnn
la source
Il convient de noter que cela vous verrouille compileSdkVersion 25, aucune API Android O et aucune fonctionnalité de bibliothèque de support introduite depuis la version 25.4.0 (par exemple, la teinte des dessins de vue d'image et le backport de morphing de chemin vectoriel). Voici la bibliothèque de support changelog developer.android.com/topic/libraries/support-library/...
Eugen Pechanec
-1

Il existe 2 options:

  1. Avez-vous changé la version de la bibliothèque de support? il s'agit d'un problème de bibliothèque assez classique lorsque les ressources ne sont parfois pas «enregistrées» avec le même nom, ou pas du tout. Ce n'est pas vous, son google. Essayez d'utiliser support lib 25 et voyez si cette erreur se produit toujours.
  2. Essayez de nettoyer le projet et de le reconstruire. Peut-être que vous êtes conservé avec certaines anciennes versions de bibliothèque dans votre dossier de construction, et lorsque vous construisez votre projet, il en retire les anciennes valeurs.
Dus
la source
1
merci pour la réponse, pour 2. J'ai fait le plein gradle clair plusieurs fois. pour 1. ma targetSdkVersion est 26, Android Studio affiche avertir si ce n'est pas cibler la dernière API et Android Studio affiche également une erreur si j'utilise une version plus ancienne de la bibliothèque de support que targetSdkVersion.
cn123h
1
Même problème après la mise à jour vers le SDK 26.
mois du
@ cn123h quelle version de la bibliothèque de support utilisez-vous?
Sufian
@amouly et votre version de support lib est?
Sufian