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

95

Até agora, recebi este erro apenas para um usuário, que usa um telefone com acesso root (SM-G900R7 Android 4.4.2). O erro é assim:

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)

Eu nunca uso android.graphics.drawable.Icon em meu código, todos os usos são de android.support.v4.graphics.drawable.IconCompate também nunca uso essa classe em meu código ...

Btw minha biblioteca de suporte é version 26.0.0, my minSdkVersion is 15 targetSdkVersion is 26.

obrigado

cn123h
fonte
4
O mesmo problema para mim. Mesmo dispositivo com acesso root, mesma versão do Android. Você encontrou uma solução?
Chris
24
Deixe-me adivinhar? Dispositivos Samsung com Android 4?
Noman Rafique
7
@NomanRafique Samsung S5, 4.4.2, com root.
Vaiden,
2
Estou experimentando a mesma coisa, mesmo dispositivo relatado via crashlyitcs. Uma instância para quase cada nova versão e quase imediatamente após a publicação. Meu aplicativo tem multidex.
djxstream
6
rastreador de problemas do google: issuetracker.google.com/issues/63151548
tabjsina

Respostas:

40

Atualizar

O problema foi corrigido na biblioteca de suporte 27.0.0. Se você atualizar, não se esqueça de alterar compileSdkVersion 27também.

O que está acontecendo?

Os dispositivos Samsung com Android 4.4 travam assim quando as classes estendem, Viewdefinem métodos que retornam ou pegam parâmetros de tipos que não estão no classpath.

Começando com a versão da biblioteca de suporte 25.4.0 AppCompatImageViewe AppCompatImageButtonsubstitui incorretamente o setImageIcon(Icon)método. Desde que a Iconaula foi introduzida na API 23, o aplicativo trava em dispositivos Samsung com API 19.

Coisa semelhante acontece quando você tenta substituir View.onApplyWindowInsets(WindowInsets).

Solução alternativa para a biblioteca de suporte 26.1.0

Até que isso seja corrigido de maneira oficial, se você estiver preso com uma versão mais antiga da biblioteca de suporte, fiz uma versão modificada de appcompat-v7onde todos os vestígios desetImageIcon métodos são removidos. Isso significa que ele não travará em um Samsung com Android 4.4.

Coloque isso na parte inferior do build.gradle do seu aplicativo:

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 substituirá a appcompat-v7dependência com o artefato modificado descrito.

Atualmente, a única versão com suporte da correção é 26.1.0.

Aviso: entenda o código antes de copiar e colar e sempre tenha cuidado ao obter código de fontes desconhecidas!

Eugen Pechanec
fonte
o que acontecerá no futuro se eu precisar atualizar a biblioteca de suporte para> 26.1.0? Acho que sua correção ficará obsoleta, certo?
Dika,
2
@Dika Não se preocupe, isso deve ser corrigido na próxima versão.
Eugen Pechanec,
1
@Chisko Não use várias versões de diferentes bibliotecas de suporte. Eu acho que você pode atualizar com segurança todas as suas bibliotecas de suporte para 26.1.0. A correção é lançada apenas para essa versão.
Eugen Pechanec,
1
@Chisko é apenas força do hábito. Muitas pessoas não sabem que as bibliotecas de suporte estão interconectadas e podem falhar se versões diferentes forem usadas. Apenas certificando-se de que você faz :)
Eugen Pechanec
1
@Alex Acabei de acessar a fonte do AppCompat 27.0.0 e está correto. Duas opções: 1) De alguma forma, você ainda está usando a biblioteca de suporte mais antiga. Verifique suas dependências resolvidas. 2) A mesma exceção é lançada em outro lugar e por causa de uma classe diferente. Você pode compartilhar o relatório de travamento ou o rastreamento de pilha? Vou dar uma olhada nisso.
Eugen Pechanec de
14

Este problema foi resolvido na biblioteca de suporte 27.0.0:

Plug-in do Android Gradle 3.x:

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

Plug-in do Android Gradle 2.x:

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

Observe que você também precisará compilar no SDK de nível 27.

Paul Lammertsma
fonte
1

Este travamento está relacionado à versão 25.4.0 da biblioteca de suporte.

Use a versão 25.3.1 .

Substituir

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

Com:

compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support:support-v4:25.3.1'
phnmnn
fonte
Vale a pena notar que isso bloqueia você compileSdkVersion 25, sem APIs do Android O e sem recursos de biblioteca de suporte introduzidos desde 25.4.0 (por exemplo, tingir drawables de visualização de imagem e backport de transformação de caminho vetorial). Aqui está o changelog da biblioteca de suporte developer.android.com/topic/libraries/support-library/…
Eugen Pechanec
-1

Existem 2 opções:

  1. Você mudou a versão da biblioteca de suporte? este é um problema de biblioteca bastante clássico quando os recursos às vezes não são 'salvos' com o mesmo nome, ou de forma alguma. Não é você, é google. Tente usar o suporte lib 25 e veja se este erro ainda ocorre.
  2. Tente limpar o projeto e reconstruir. Talvez você tenha mantido algumas versões de biblioteca antigas em sua pasta de construção e, quando você constrói seu projeto, ele retira valores antigos dele.
Dus
fonte
1
obrigado pela resposta, por 2. Fiz full gradle clear muitas vezes. para 1. minha targetSdkVersion é 26, o Android Studio mostra avisar se não for direcionado à API mais recente e o Android Studio também mostra erro se eu usar uma versão mais antiga do suporte lib do que targetSdkVersion.
cn123h
1
O mesmo problema após a atualização para o SDK 26.
amouly
@ cn123h qual versão da biblioteca de suporte você está usando?
Sufian de
@amouly e sua versão lib de suporte é?
Sufian de