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

95

Hasta ahora recibí este error solo para un usuario, que usa un teléfono rooteado (SM-G900R7 Android 4.4.2). El error es así:

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)

Nunca uso android.graphics.drawable.Icon en mi código, todos los usos son de android.support.v4.graphics.drawable.IconCompaty nunca uso esa clase en mi código ...

Por cierto, mi biblioteca de soporte es version 26.0.0, my minSdkVersion is 15 targetSdkVersion is 26.

Gracias

cn123h
fuente
4
El mismo problema para mí. Mismo dispositivo rooteado, misma versión de Android. ¿Encontraste una solución?
Chris
24
¿Déjame adivinar? ¿Dispositivos Samsung con Android 4?
Noman Rafique
7
@NomanRafique Samsung S5, 4.4.2, rooteado.
Vaiden
2
Estoy experimentando lo mismo, el mismo dispositivo informado a través de crashlyitcs. Una instancia casi en cada nueva versión y casi inmediatamente después de su publicación. Mi aplicación tiene multidex.
djxstream
6
rastreador de problemas de Google: issuetracker.google.com/issues/63151548
tabjsina

Respuestas:

40

Actualizar

El problema se solucionó en la biblioteca de soporte 27.0.0. Si actualiza, no olvide cambiar compileSdkVersion 27también.

¿Qué está pasando?

Los dispositivos Samsung con Android 4.4 fallan así cuando las clases que se extienden Viewdefinen métodos que devuelven o toman parámetros de tipos que no están en classpath.

Comenzando con la versión de la biblioteca de soporte 25.4.0 AppCompatImageViewy AppCompatImageButtonanula incorrectamente el setImageIcon(Icon)método. Desde que Iconse introdujo la clase en API 23, la aplicación se bloquea en dispositivos Samsung con API 19.

Algo similar sucede cuando intentas anular View.onApplyWindowInsets(WindowInsets).

Solución alternativa para la biblioteca de soporte 26.1.0

Hasta que esto se solucione de manera oficial, si está atascado con una versión anterior de la biblioteca de soporte, hice una versión modificada de appcompat-v7donde setImageIconse eliminan todos los rastros de métodos. Esto significa que no se bloqueará en un Samsung con Android 4.4.

Pon esto en la parte inferior de build.gradle de tu aplicación:

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

Este código reemplazará la appcompat-v7dependencia con el artefacto modificado descrito.

Actualmente, la única versión compatible de la solución es 26.1.0.

Advertencia: Comprenda el código antes de copiar y pegar, y siempre tenga cuidado al obtener código de fuentes desconocidas.

Eugen Pechanec
fuente
¿Qué pasará en el futuro si debo actualizar la biblioteca de soporte a> 26.1.0? Creo que tu solución quedará obsoleta, ¿verdad?
Dika
2
@Dika No se preocupe, debería solucionarse en la próxima versión.
Eugen Pechanec
1
@Chisko No utilice varias versiones de diferentes bibliotecas de soporte. Creo que puede actualizar de forma segura todas sus bibliotecas de soporte a 26.1.0. La solución solo se publica para esa versión.
Eugen Pechanec
1
@Chisko es solo fuerza de la costumbre. Mucha gente no sabe que las bibliotecas de soporte están interconectadas y pueden fallar si se utilizan diferentes versiones. Solo asegurándome de hacerlo :)
Eugen Pechanec
1
@Alex Acabo de revisar la fuente de AppCompat 27.0.0 y es correcto. Dos opciones: 1) De alguna manera, todavía estás usando una biblioteca de soporte más antigua. Verifique sus dependencias resueltas. 2) La misma excepción se lanza en otro lugar y debido a una clase diferente. ¿Puede compartir el informe de fallos o el seguimiento de la pila? Lo miraré.
Eugen Pechanec
14

Este problema se resolvió en la biblioteca de soporte 27.0.0:

Complemento de Android Gradle 3.x:

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

Complemento de Android Gradle 2.x:

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

Tenga en cuenta que también deberá compilar con el nivel 27 del SDK.

Paul Lammertsma
fuente
1

Este bloqueo está relacionado con la versión 25.4.0 de la biblioteca de soporte.

Utilice la versión 25.3.1 .

Reemplazar

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'
phnmnn
fuente
Vale la pena señalar que esto lo bloquea compileSdkVersion 25, sin API de Android O y sin funciones de biblioteca de soporte introducidas desde la versión 25.4.0 (por ejemplo, elementos de diseño de vista de imagen teñida y backport de transformación de ruta de vector). Aquí está el registro de cambios de la biblioteca de soporte developer.android.com/topic/libraries/support-library/…
Eugen Pechanec
-1

Hay 2 opciones:

  1. ¿Ha cambiado la versión de la biblioteca de soporte? Este es un problema de biblioteca bastante clásico cuando los recursos a veces no se 'guardan' con el mismo nombre, o no se guardan en absoluto. No eres tú, es Google. Intente usar el soporte lib 25 y vea si este error persiste.
  2. Intente limpiar el proyecto y reconstruirlo. Tal vez tenga algunas versiones antiguas de la biblioteca en su carpeta de compilación, y cuando construye su proyecto, toma valores antiguos de él.
Dus
fuente
1
gracias por la respuesta, por 2. Lo hice completamente gradle claro muchas veces. para 1. mi targetSdkVersion es 26, Android Studio muestra una advertencia si no se dirige a la API más reciente y Android Studio también muestra un error si uso una versión anterior de la biblioteca de soporte que targetSdkVersion.
cn123h
1
El mismo problema después de actualizar al SDK 26.
amouly
@ cn123h ¿qué versión de la biblioteca de soporte está usando?
Sufian
@amouly y su versión lib de soporte es?
Sufian