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


95

Finora ho ricevuto questo errore solo per un utente, che utilizza un telefono con root (SM-G900R7 Android 4.4.2). L'errore è così:

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)

Non uso mai android.graphics.drawable.Icon nel mio codice, tutti gli usi provengono da android.support.v4.graphics.drawable.IconCompate non uso mai quella classe nel mio codice ...

Btw la mia libreria di supporto è version 26.0.0, my minSdkVersion is 15 targetSdkVersion is 26.

Grazie


4
Lo stesso problema per me. Stesso dispositivo rooted, stessa versione di Android. Hai trovato una soluzione?
Chris

24
Lasciami indovinare? Dispositivi Samsung con Android 4?
Noman Rafique

7
@NomanRafique Samsung S5, 4.4.2, radicato.
Vaiden

2
Sto riscontrando la stessa cosa, lo stesso dispositivo segnalato tramite crashlyitcs. Un'istanza quasi ogni nuova versione e quasi immediatamente dopo la pubblicazione. La mia app ha il multidex.
djxstream

6
tracker dei problemi di Google: issuetracker.google.com/issues/63151548
tabjsina

Risposte:


40

Aggiornare

Il problema è stato risolto nella libreria di supporto 27.0.0. Se aggiorni non dimenticare di cambiare compileSdkVersion 27anche tu .

Che cosa sta succedendo?

I dispositivi Samsung con Android 4.4 si bloccano in questo modo quando le classi che si estendono Viewdefiniscono metodi che restituiscono o accettano parametri di tipi che non sono su classpath.

A partire dalla versione della libreria di supporto 25.4.0 AppCompatImageViewe AppCompatImageButtonsovrascrive in setImageIcon(Icon)modo errato il metodo. Poiché la Iconclasse è stata introdotta nell'API 23, l'app si arresta in modo anomalo sui dispositivi Samsung con API 19.

Cosa simile accade quando provi a sovrascrivere View.onApplyWindowInsets(WindowInsets).

Soluzione alternativa per la libreria di supporto 26.1.0

Fino a quando questo non viene risolto in modo ufficiale, se sei bloccato con una versione precedente della libreria di supporto, ho creato una versione modificata in appcompat-v7cui setImageIconvengono rimosse tutte le tracce dei metodi. Ciò significa che non si bloccherà su un Samsung con Android 4.4.

Mettilo in fondo al file build.gradle della tua app:

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

Questo codice sostituirà la appcompat-v7dipendenza con l'artefatto modificato descritto.

Attualmente l'unica versione supportata della correzione è 26.1.0.

Avvertenza: comprendere il codice prima di eseguire il copia-incolla e prestare sempre attenzione quando si ottiene codice da fonti sconosciute!


cosa succederà in futuro se devo aggiornare la libreria di supporto a> 26.1.0? Penso che la tua correzione sarà obsoleta, giusto?
Dika

2
@Dika Nessun problema, dovrebbe essere risolto nella prossima versione.
Eugen Pechanec

1
@Chisko Non utilizzare più versioni di diverse librerie di supporto. Penso che tu possa aggiornare in sicurezza tutte le tue librerie di supporto alla 26.1.0. La correzione viene rilasciata solo per quella versione.
Eugen Pechanec

1
@Chisko è solo forza dell'abitudine. Molte persone non sanno che le librerie di supporto sono interconnesse e potrebbero bloccarsi se vengono utilizzate versioni diverse. Sto solo assicurandomi che tu lo faccia :)
Eugen Pechanec

1
@Alex Sono appena passato dal sorgente di AppCompat 27.0.0 ed è corretto. Due opzioni: 1) In qualche modo stai ancora utilizzando la libreria di supporto precedente. Controlla le tue dipendenze risolte. 2) La stessa eccezione viene lanciata altrove ea causa di una classe diversa. Puoi condividere il rapporto sugli arresti anomali o la traccia dello stack? Lo esaminerò.
Eugen Pechanec

14

Questo problema è stato risolto nella libreria di supporto 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'

Tieni presente che dovrai compilare anche con il livello SDK 27.


1

Questo arresto anomalo riguardava la versione 25.4.0 della libreria di supporto.

Usa la versione 25.3.1 .

Sostituire

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

Con:

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

Vale la pena notare che questo ti blocca compileSdkVersion 25, nessuna API Android O e nessuna funzionalità di libreria di supporto introdotta dalla 25.4.0 (ad esempio, i drawables della visualizzazione dell'immagine a colori e il backport per il morphing del percorso vettoriale). Ecco il log delle modifiche della libreria di supporto developer.android.com/topic/libraries/support-library/…
Eugen Pechanec

-1

Ci sono 2 opzioni:

  1. Hai cambiato la versione della libreria di supporto? questo è un problema di libreria abbastanza classico quando le risorse a volte non vengono "salvate" con lo stesso nome, o non lo sono affatto. Non sei tu, è Google. Prova a utilizzare support lib 25 e verifica se questo errore si verifica ancora.
  2. Prova a pulire il progetto e ricostruiscilo. Forse sei tenuto con alcune vecchie versioni della libreria nella cartella di build e quando crei il tuo progetto prende i vecchi valori da esso.

1
grazie per la risposta, per 2. Ho fatto il pieno gradle molte volte. per 1. my targetSdkVersion è 26, Android Studio mostra warn if not target the newest API e Android Studio mostra anche un errore se utilizzo una versione precedente di support lib rispetto a targetSdkVersion.
cn123h

1
Lo stesso problema dopo l'aggiornamento di SDK 26.
amouly

@ cn123h quale versione della libreria di supporto stai usando?
Sufian,

@amouly e la tua versione lib di supporto è?
Sufian,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.