AndroidX: Appcompat I: art error android.view.View $ OnUnhandledKeyEventListener

105

Em um projeto recém-criado com Androidx: appcompat: appcompat: 1.0.0-rc01, estou recebendo o

java.lang.ClassNotFoundException: Didn't find class 
"android.view.View$OnUnhandledKeyEventListener" on path: DexPathList

Eu também adicionei configuration.all

configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        def requested = details.requested
        if (requested.group == "androidx.appcompat") {
            if (!requested.name.startsWith("multidex")) {
                details.useVersion "1.+"
            }
        }
    }
}

Este não está afetando a funcionalidade do aplicativo ou travamentos. Mas sempre tem esse erro quando o app está rodando. Por favor, ajude-me a resolver o erro. Todo o rastreamento de pilha é o seguinte.

I/art: Rejecting re-init on previously-failed class java.lang.Class<androidx.core.view.ViewCompat$OnUnhandledKeyEventListenerWrapper>: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/view/View$OnUnhandledKeyEventListener;
I/art:     at void androidx.core.view.ViewCompat.setBackground(android.view.View, android.graphics.drawable.Drawable) (ViewCompat.java:2341)
        at void androidx.appcompat.widget.ActionBarContainer.<init>(android.content.Context, android.util.AttributeSet) (ActionBarContainer.java:62)
        at java.lang.Object java.lang.reflect.Constructor.newInstance0!(java.lang.Object[]) (Constructor.java:-2)
        at java.lang.Object java.lang.reflect.Constructor.newInstance(java.lang.Object[]) (Constructor.java:430)
        at android.view.View android.view.LayoutInflater.createView(java.lang.String, java.lang.String, android.util.AttributeSet) (LayoutInflater.java:645)
        at android.view.View android.view.LayoutInflater.createViewFromTag(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet, boolean) (LayoutInflater.java:787)
        at android.view.View android.view.LayoutInflater.createViewFromTag(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet) (LayoutInflater.java:727)
        at void android.view.LayoutInflater.rInflate(org.xmlpull.v1.XmlPullParser, android.view.View, android.content.Context, android.util.AttributeSet, boolean) (LayoutInflater.java:858)
        at void android.view.LayoutInflater.rInflateChildren(org.xmlpull.v1.XmlPullParser, android.view.View, android.util.AttributeSet, boolean) (LayoutInflater.java:821)
        at android.view.View android.view.LayoutInflater.inflate(org.xmlpull.v1.XmlPullParser, android.view.ViewGroup, boolean) (LayoutInflater.java:518)
        at android.view.View android.view.LayoutInflater.inflate(int, android.view.ViewGroup, boolean) (LayoutInflater.java:426)
        at android.view.View android.view.LayoutInflater.inflate(int, android.view.ViewGroup) (LayoutInflater.java:377)
        at android.view.ViewGroup androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor() (AppCompatDelegateImpl.java:607)
        at void androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor() (AppCompatDelegateImpl.java:518)
        at void androidx.appcompat.app.AppCompatDelegateImpl.setContentView(int) (AppCompatDelegateImpl.java:466)
        at void androidx.appcompat.app.AppCompatActivity.setContentView(int) (AppCompatActivity.java:140)
        at void com.connectdb.truckish.common.base.BaseActivity.onCreate(android.os.Bundle) (BaseActivity.java:44)
        at void com.connectdb.truckish.MainActivity.onCreate(android.os.Bundle) (MainActivity.java:14)
        at void android.app.Activity.performCreate(android.os.Bundle) (Activity.java:6672)
        at void android.app.Instrumentation.callActivityOnCreate(android.app.Activity, android.os.Bundle) (Instrumentation.java:1140)
        at android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent) (ActivityThread.java:2612)
        at void android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:2724)
        at void android.app.ActivityThread.-wrap12(android.app.ActivityThread, android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:-1)
        at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1473)
        at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:102)
        at void android.os.Looper.loop() (Looper.java:154)
        at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6123)
        at java.lang.Object java.lang.reflect.Method.invoke!(java.lang.Object, java.lang.Object[]) (Method.java:-2)
        at void com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run() (ZygoteInit.java:867)
        at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:757)
    Caused by: java.lang.ClassNotFoundException: Didn't find class "android.view.View$OnUnhandledKeyEventListener" on path: DexPathList[[zip file "/data/app/com.connectdb.truckish-2/base.apk", zip file "/data/app/com.connectdb.truckish-2/split_lib_dependencies_apk.apk", zip file "/data/app/com.connectdb.truckish-2/split_lib_slice_0_apk.apk", zip file "/data/app/com.connectdb.truckish-2/split_lib_slice_1_apk.apk", zip file "/data/app/com.connectdb.truckish-2/split_lib_slice_2_apk.apk", zip file "/data/app/com.connectdb.truckish-2/split_lib_slice_3_apk.apk", zip file "/data/app/com.connectdb.truckish-2/split_lib_slice_4_apk.apk", zip file "/data/app/com.connectdb.truckish-2/split_lib_slice_5_apk.apk", zip file "/data/app/com.connectdb.truckish-2/split_lib_slice_6_apk.apk", zip file "/data/app/com.connectdb.truckish-2/split_lib_slice_7_apk.apk", zip file "/data/app/com.connectdb.truckish-2/split_lib_slice_8_apk.apk", zip file "/data/app/com.connectdb.truckish-2/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[
        at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:56)
        at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:380)
        at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312)
        at void androidx.core.view.ViewCompat.setBackground(android.view.View, android.graphics.drawable.Drawable) (ViewCompat.java:2341)
        at void androidx.appcompat.widget.ActionBarContainer.<init>(android.content.Context, android.util.AttributeSet) (ActionBarContainer.java:62)
        at java.lang.Object java.lang.reflect.Constructor.newInstance0!(java.lang.Object[]) (Constructor.java:-2)
        at java.lang.Object java.lang.reflect.Constructor.newInstance(java.lang.Object[]) (Constructor.java:430)
        at android.view.View android.view.LayoutInflater.createView(java.lang.String, java.lang.String, android.util.AttributeSet) (LayoutInflater.java:645)
        at android.view.View android.view.LayoutInflater.createViewFromTag(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet, boolean) (LayoutInflater.java:787)
        at android.view.View android.view.LayoutInflater.createViewFromTag(android.view.View, java.lang.String, android.content.Context, android.util.AttributeSet) (LayoutInflater.java:727)
        at void android.view.LayoutInflater.rInflate(org.xmlpull.v1.XmlPullParser, android.view.View, android.content.Context, android.util.AttributeSet, boolean) (LayoutInflater.java:858)
        at void android.view.LayoutInflater.rInflateChildren(org.xmlpull.v1.XmlPullParser, android.view.View, android.util.AttributeSet, boolean) (LayoutInflater.java:821)
        at android.view.View android.view.LayoutInflater.inflate(org.xmlpull.v1.XmlPullParser, android.view.ViewGroup, boolean) (LayoutInflater.java:518)
        at android.view.View android.view.LayoutInflater.inflate(int, android.view.ViewGroup, boolean) (LayoutInflater.java:426)
        at android.view.View android.view.LayoutInflater.inflate(int, android.view.ViewGroup) (LayoutInflater.java:377)
        at android.view.ViewGroup androidx.appcompat.app.AppCompatDelegateImpl.createSubDecor() (AppCompatDelegateImpl.java:607)
        at void androidx.appcompat.app.AppCompatDelegateImpl.ensureSubDecor() (AppCompatDelegateImpl.java:518)
        at void androidx.appcompat.app.AppCompatDelegateImpl.setContentView(int) (AppCompatDelegateImpl.java:466)
        at void androidx.appcompat.app.AppCompatActivity.setContentView(int) (AppCompatActivity.java:140)
        at void com.connectdb.truckish.common.base.BaseActivity.onCreate(android.os.Bundle) (BaseActivity.java:44)
        at void com.connectdb.truckish.MainActivity.onCreate(android.os.Bundle) (MainActivity.java:14)
        at void android.app.Activity.performCreate(android.os.Bundle) (Activity.java:6672)
        at void android.app.Instrumentation.callActivityOnCreate(android.app.Activity, android.os.Bundle) (Instrumentation.java:1140)
        at android.app.Activity android.app.ActivityThread.performLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent) (ActivityThread.java:2612)
        at void android.app.ActivityThread.handleLaunchActivity(android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:2724)
        at void android.app.ActivityThread.-wrap12(android.app.ActivityThread, android.app.ActivityThread$ActivityClientRecord, android.content.Intent, java.lang.String) (ActivityThread.java:-1)
        at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1473)
        at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:102)
        at void android.os.Looper.loop() (Looper.java:154)
        at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6123)
        at java.lang.Object java.lang.reflect.Method.invoke!(java.lang.Object, java.lang.Object[]) (Method.java:-2)
        at void com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run() (ZygoteInit.java:867)
        at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:757)
Mohan Rex
fonte
1
Eu tenho o mesmo erro. Você encontrou alguma solução alternativa?
c0nst
Não, não encontrei nenhuma solução alternativa.
Mohan Rex
1
Estou recebendo um erro semelhante, mas não é AndroidX Rejecting re-init on previously-failed class java.lang.Class<android.support.v4.view.ViewCompat$OnUnhandledKeyEventListenerWrapper>: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/view/View$OnUnhandledKeyEventListener;. Esta é uma causa diferente?
Dale
@Mohan Rex Por favor me ajude como corrigir esse problema?
Garg's de
1
A única coisa que me ajudou foi substituir estende AppCompatActivity com apenas Activity em todas as minhas atividades. Por exemplo, a classe pública MainActivity estende Activity. Nada mais funcionou para mim. Depois disso, o aviso desaparece, pois está relacionado ao AppCompat no android X. No entanto, não é a melhor solução para compatibilidade com versões anteriores
Darksymphony

Respostas:

88

Como ALFlanagan mencionou em um comentário, o problema é que android.support.v4.view.ViewCompatnão implementa View.OnUnhandledKeyEventListenerna nova estrutura do pacote androidx e apenas implementa a partir da API 28 na estrutura lib de suporte (pelo menos na versão 28.0.0). Portanto, o aviso aparece em dispositivos com API <28 e não aparece naqueles> = 28.

Este é o código relacionado na ViewCompat.classclasse da estrutura do pacote de suporte:

@RequiresApi(28)
private static class OnUnhandledKeyEventListenerWrapper implements OnUnhandledKeyEventListener {
    private ViewCompat.OnUnhandledKeyEventListenerCompat mCompatListener;

    OnUnhandledKeyEventListenerWrapper(ViewCompat.OnUnhandledKeyEventListenerCompat listener) {
        this.mCompatListener = listener;
    }

    public boolean onUnhandledKeyEvent(View v, KeyEvent event) {
        return this.mCompatListener.onUnhandledKeyEvent(v, event);
    }
}

Não consigo pensar em nenhuma solução fácil para resolver esse aviso.

AlvaroSantisteban
fonte
14
O problema foi marcado como não corrigido e ninguém se preocupou em dar uma explicação ou uma solução alternativa.
Odys
4
Parece que o bug foi reenviado aqui issuetracker.google.com/issues/120750246
aaronmarino
2
Bem, meu aplicativo simplesmente não está funcionando e acabei de ver este erro no meu debug (Logcat). O aplicativo não trava, mas o "contentView" também não é atualizado, deixando uma tela em branco.
Iúri dos Anjos
1
Estou tendo o mesmo problema ... Não está travando, mas o modo de exibição está apresentando um comportamento inesperado. Começou a acontecer assim que atualizei o SDK de compilação de 27.
Amit Kumar
2
Este é um travamento de tempo de execução em todos os dispositivos com API <26
John Sardinha
0

Eu acho que este é um bug no androidx. Eu descobri que o erro causa atraso nas compilações de depuração, mas não mostra ou diminui a velocidade das compilações de produção, então simplesmente ignorei por agora.

Bob bobbington
fonte
Já estou usando AppCompatActivity :(. Mas o erro aparece.
Mohan Rex
1
@MohanRex - exatamente, esta mensagem aparece ao usar AppCompatActivity. No entanto, deve-se usar AppCompatActivity - apenas ignore esse incômodo inofensivo.
Toolmaker Steve
0

você pode usar o aspectJ para anular esse problema, modificando o código de bytes do androidx.

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class UnHandleKeyEventAspectJ {
    public static final String TAG="UnHandleKeyEventAspectJ";
    @Pointcut("execution(* androidx.core.view.ViewCompat.setOnApplyWindowInsetsListener(android.view.View, androidx.core.view.OnApplyWindowInsetsListener))")
public void kotlinClassInit() {

}
    @Around("kotlinClassInit()")
    public void addTransaction(ProceedingJoinPoint joinPoint){
        try {
            joinPoint.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }
}
包 奇 锋
fonte
Você pode explicar como fazer o AspectJ funcionar com o Android Studio 3.6.3. Estou recebendo este erro ao criar o modelo "Atividade básica" usando compileSdkVersion 28, buildToolsVersion 29.0.3, minSdkVersion 16, targetSdkVersion 28.
kbro
-2

As respostas acima estão corretas. A única maneira de evitar isso é remover referências a AppCompat - por exemplo, mudei para FragmentActivity. A má notícia é que todas as novas bibliotecas de materiais fazem referência e experimentam o problema. Eu não queria que isso ocorresse na minha inicialização - o acerto não é tão ruim depois. É apenas um aviso - mas tem um impacto no desempenho e é muito falso e mal administrado pelo grande G.

Daniel Haywood
fonte
1
Re "Eu mudei para FragmentActivity" . Não é uma boa ideia - isso significa que seu aplicativo não será executado em dispositivos mais antigos. Fique com o AppCompat. Re "É apenas um aviso - mas tem um impacto no desempenho" - para esclarecer, qualquer impacto no desempenho é insignificante no lançamento da versão; isso é principalmente um aborrecimento, adicionando confusão perto do início do log de depuração.
Toolmaker Steve
-3

A anotação @RequiresApi(28)realmente significa que a única build.gradleconfiguração que eliminaria o log-spam seria aumentar o minSdkVersionpara pelo menos 28. Considere isso apenas como um aviso que não pode ser silenciado - não um erro.

android {    
    defaultConfig {
        targetSdkVersion 28
        compileSdkVersion 28
        minSdkVersion 28
    }
}

Os votos negativos apenas prova o quão anti-intelectual este site é ...

Martin Zeitler
fonte
não tão utilizável .. você não pode esperar que os usuários tenham apenas 28+ atualmente.
zeroDivider
bem, é apenas um aviso, mesmo que o log-spam seja irritante ... no entanto, pode até ser possível adicionar um padrão de exclusão regex ao logcat e simplesmente filtrar essa mensagem de log.
Martin Zeitler
minSdkVersion 28 é definitivamente muito alto para a maior parte do APP
Wu Yuan Chun
@WuYuanChun esta não era a pergunta - e esta é a única resposta que realmente esconde o problema.
Martin Zeitler
Para esclarecer: alterar minSDK para 28 resulta em um aplicativo que não será executado em dispositivos mais antigos. Certo? Nesse caso, isso deve estar na resposta como um aviso importante.
Toolmaker Steve
-5

Você pode evitá-lo porque essa classe específica apenas no Android 9.

Jonathan
fonte
1
Você poderia dar mais informações. Será muito útil.
Mohan Rex
3
Consulte developer.android.com/reference/android/view/… . Parece que este é um bug em que android.support.v4.view.ViewCompat não implementa uma interface esperada.
AL Flanagan
4
(A classe acima é ==> androidx.core.view.ViewCompat) Há um relatório de bug issuetracker.google.com/issues/110162198 que está marcado como "impossível duplicar". Você pode querer considerar a apresentação de um relatório de bug com todas as informações necessárias para reproduzir o problema.
AL Flanagan
Thx para a referência, eu estendi o problema no rastreador com meu código na esperança de que eles possam reproduzi-lo.
findusl