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

95

Bisher habe ich diesen Fehler nur für einen Benutzer erhalten, der ein gerootetes Telefon verwendet (SM-G900R7 Android 4.4.2). Der Fehler ist wie folgt:

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)

Ich benutze niemals android.graphics.drawable.Icon in meinem Code, alle Verwendungen stammen von android.support.v4.graphics.drawable.IconCompatund ich benutze diese Klasse auch nie in meinem Code ...

Übrigens ist meine Support-Bibliothek version 26.0.0, my minSdkVersion is 15 targetSdkVersion is 26.

Vielen Dank

cn123h
quelle
4
Gleiches Problem für mich. Gleiches gerootetes Gerät, gleiche Android-Version. Haben Sie eine Lösung gefunden?
Chris
24
Lass mich raten? Samsung-Geräte mit Android 4?
Noman Rafique
7
@NomanRafique Samsung S5, 4.4.2, verwurzelt.
Vaiden
2
Ich erlebe dasselbe, dasselbe Gerät, das über Absturz gemeldet wurde. Eine Instanz fast jede neue Version und fast unmittelbar nach der Veröffentlichung. Meine App hat Multidex.
DJXstream
6
Google Issue Tracker: issuetracker.google.com/issues/63151548
tabjsina

Antworten:

40

Aktualisieren

Das Problem wurde in der Support-Bibliothek 27.0.0 behoben. Wenn Sie aktualisieren, vergessen Sie nicht, auch zu ändern compileSdkVersion 27.

Was ist los?

Samsung-Geräte mit Android 4.4 stürzen auf diese Weise ab, wenn Klassenerweiterungen ViewMethoden definieren, die Parameter von Typen zurückgeben oder annehmen, die sich nicht im Klassenpfad befinden.

Beginnend mit der Support Library Version 25.4.0 AppCompatImageViewund AppCompatImageButtonüberschreibt die setImageIcon(Icon)Methode falsch . Seit IconEinführung der Klasse in API 23 stürzt die App auf Samsung-Geräten mit API 19 ab.

Ähnliches passiert, wenn Sie versuchen, zu überschreiben View.onApplyWindowInsets(WindowInsets).

Problemumgehung für die Support-Bibliothek 26.1.0

Bis dies auf offizielle Weise behoben wird. Wenn Sie mit einer älteren Version der Support-Bibliothek nicht weiterkommen, habe ich eine modifizierte Version erstellt, in der appcompat-v7alle setImageIconMethodenspuren entfernt werden. Dies bedeutet, dass es auf einem Samsung mit Android 4.4 nicht abstürzt.

Fügen Sie dies am Ende des build.gradle Ihrer App ein:

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

Dieser Code ersetzt die appcompat-v7Abhängigkeit durch das beschriebene modifizierte Artefakt.

Derzeit ist die einzige unterstützte Version des Fixes 26.1.0.

Warnung: Verstehen Sie den Code vor dem Einfügen und seien Sie immer vorsichtig, wenn Sie Code aus unbekannten Quellen erhalten!

Eugen Pechanec
quelle
Was passiert in Zukunft, wenn ich die Support-Bibliothek auf> 26.1.0 aktualisieren muss? Ich denke, Ihr Fix wird veraltet sein, oder?
Dika
2
@Dika Keine Sorge, es sollte in der nächsten Version behoben werden.
Eugen Pechanec
1
@Chisko Verwenden Sie nicht mehrere Versionen verschiedener Support-Bibliotheken. Ich denke, Sie können alle Ihre Support-Bibliotheken sicher auf 26.1.0 aktualisieren. Das Update wird nur für diese eine Version veröffentlicht.
Eugen Pechanec
1
@Chisko es ist nur Gewohnheit. Viele Leute wissen nicht, dass Support-Bibliotheken miteinander verbunden sind und abstürzen können, wenn verschiedene Versionen verwendet werden. Stellen Sie nur sicher, dass Sie tun :)
Eugen Pechanec
1
@Alex Ich habe gerade die Quelle von AppCompat 27.0.0 durchgesehen und es ist korrekt. Zwei Optionen: 1) Irgendwie verwenden Sie immer noch eine ältere Support-Bibliothek. Überprüfen Sie Ihre aufgelösten Abhängigkeiten. 2) Dieselbe Ausnahme wird an anderer Stelle und aufgrund einer anderen Klasse ausgelöst. Können Sie den Absturzbericht oder die Stapelverfolgung freigeben? Ich werde es untersuchen.
Eugen Pechanec
14

Dieses Problem wurde behoben in der Support-Bibliothek 27.0.0 behoben:

Android Gradle Plugin 3.x:

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

Android Gradle Plugin 2.x:

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

Beachten Sie, dass Sie auch mit SDK Level 27 kompilieren müssen.

Paul Lammertsma
quelle
1

Dieser Absturz bezog sich auf die Version 25.4.0 der Support-Bibliothek.

Verwenden Sie 25.3.1 Version .

Ersetzen

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

Mit:

compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support:support-v4:25.3.1'
phnmnn
quelle
Es ist erwähnenswert, dass Sie dadurch compileSdkVersion 25gesperrt sind, dass seit 25.4.0 keine Android O-APIs und keine Funktionen der Unterstützungsbibliothek eingeführt wurden (z. B. Tönen von Bildansichten und Vektorpfad-Morphing-Backport). Hier ist das Änderungsprotokoll der Support-Bibliothek. Developer.android.com/topic/libraries/support-library/…
Eugen Pechanec
-1

Es gibt 2 Möglichkeiten:

  1. Haben Sie die Version der Support-Bibliothek geändert? Dies ist ein ziemlich klassisches Bibliotheksproblem, wenn die Ressourcen manchmal nicht oder überhaupt nicht mit demselben Namen "gespeichert" werden. Es ist nicht du, es ist Google. Versuchen Sie, support lib 25 zu verwenden, und prüfen Sie, ob dieser Fehler weiterhin auftritt.
  2. Versuchen Sie, das Projekt zu bereinigen und neu zu erstellen. Möglicherweise bleiben einige alte Bibliotheksversionen in Ihrem Erstellungsordner erhalten, und wenn Sie Ihr Projekt erstellen, werden alte Werte daraus übernommen.
Dus
quelle
1
Vielen Dank für die Antwort, für 2. Ich habe viele Male voll gradle klar gemacht. für 1. mein targetSdkVersion ist 26, Android Studio zeigt Warnung an, wenn nicht das Ziel der neuesten API ist, und Android Studio zeigt auch Fehler an, wenn ich eine ältere Version von support lib als targetSdkVersion verwende.
cn123h
1
Gleiches Problem nach dem Update auf SDK 26.
Amouly
@ cn123h Welche Version der Support-Bibliothek verwenden Sie?
Sufian
@amouly und deine Support Lib Version ist?
Sufian