AndroidX: Appcompat I: error de arte android.view.View $ OnUnhandledKeyEventListener

105

En un proyecto recién creado con Androidx: appcompat: appcompat: 1.0.0-rc01, obtengo el

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

También había agregado 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 no afecta la funcionalidad de la aplicación o se bloquea. Pero siempre tiene este error cuando la aplicación se está ejecutando. Amablemente ayúdame a resolver el error. Todo el seguimiento de la pila es el siguiente.

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
fuente
1
Yo tengo el mismo error. ¿Ha encontrado alguna solución alternativa?
c0nst
No, no he encontrado ninguna solución.
Mohan Rex
1
Recibo un error similar pero no de 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;. ¿Es esta una causa diferente?
Dale
@Mohan Rex ¿Ayúdame a solucionar este problema?
Garg's
1
Lo único que me ayudó es reemplazar la extensión AppCompatActivity con solo Activity en todas mis actividades. Por ejemplo, la clase pública MainActivity extiende la actividad. Nada más funcionó para mí. Después de esto, la advertencia desaparece ya que está relacionada con AppCompat en Android X. Sin embargo, no es la mejor solución para la compatibilidad con versiones anteriores
Darksymphony

Respuestas:

88

Como ALFlanagan mencionó en un comentario, el problema es que android.support.v4.view.ViewCompatno se implementa View.OnUnhandledKeyEventListeneren la nueva estructura del paquete androidx y solo lo implementa a partir de la API 28 en la estructura de la biblioteca de soporte (al menos en la versión 28.0.0). Por lo tanto, la advertencia aparece en dispositivos con API <28 y no aparece en aquellos> = 28.

Este es el código relacionado en la ViewCompat.classclase de la estructura del paquete de soporte:

@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);
    }
}

No puedo pensar en ninguna solución fácil para resolver esta advertencia.

ÁlvaroSantisteban
fuente
14
El problema se ha marcado como no se solucionará y a nadie le importó dar una explicación o una solución.
Odys
4
Parece que el error se ha vuelto a enviar aquí issuetracker.google.com/issues/120750246
aaronmarino
2
Bueno, la aplicación mía simplemente no funciona en absoluto y solo veo este error en mi depuración (Logcat). La aplicación no se bloquea, pero el "contentView" tampoco se actualiza, dejando una pantalla en blanco.
Iúri dos Anjos
1
Tengo el mismo problema. No se bloquea, pero la vista tiene un comportamiento inesperado. Comenzó a suceder tan pronto como actualicé el SDK de compilación a 28 desde 27.
Amit Kumar
2
Este es un bloqueo de tiempo de ejecución en todos los dispositivos con API <26
John Sardinha
0

Creo que esto es un error en androidx. Descubrí que el error provoca un retraso en las compilaciones de depuración, pero no muestra ni ralentiza las compilaciones de producción, por lo que lo he ignorado por ahora.

Bob Bobbington
fuente
Ya estoy usando AppCompatActivity :(. Pero aparece el error.
Mohan Rex
1
@MohanRex: exactamente, este mensaje aparece cuando se usa AppCompatActivity. Sin embargo, uno debe usar AppCompatActivity, simplemente ignore esta molestia inofensiva.
ToolmakerSteve
0

puede usar aspectJ para anular este problema modificando el código de bytes de 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();
        }
    }
}
包 奇 锋
fuente
¿Puede explicar cómo hacer que AspectJ funcione con Android Studio 3.6.3? Recibo este error después de haber creado la plantilla "Actividad básica" usando compileSdkVersion 28, buildToolsVersion 29.0.3, minSdkVersion 16, targetSdkVersion 28.
kbro
-2

Las respuestas anteriores son correctas. La única forma de evitar esto es eliminar las referencias a AppCompat, por ejemplo, cambié a FragmentActivity. La mala noticia es que las nuevas bibliotecas de materiales hacen referencia y experimentan el problema. No quería que esto ocurriera en mi inicio, el éxito no es tan malo más adelante. Es solo una advertencia, pero tiene un impacto en el rendimiento y es bastante falso y mal manejado por el gran G.

Daniel Haywood
fuente
1
Re "Cambié a FragmentActivity" . No es una buena idea, eso significa que su aplicación no se ejecutará en dispositivos más antiguos. Quédese con AppCompat. Re "Es solo una advertencia, pero tiene un impacto en el rendimiento" , para aclarar, cualquier impacto en el rendimiento es insignificante en la compilación de la versión; esto es principalmente una molestia, agregando desorden cerca del comienzo del registro de depuración.
ToolmakerSteve
-3

La anotación en @RequiresApi(28)realidad significa que la única build.gradleconfiguración que eliminaría el log-spam sería subir minSdkVersional menos a 28. Considérelo como una advertencia que no se puede silenciar, no como un error.

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

Los votos negativos solo demuestran cuán anti-intelectual es este sitio ...

Martin Zeitler
fuente
no tan utilizable ... no se puede esperar que los usuarios tengan solo 28+ en estos días.
zeroDivider
bueno, es solo una advertencia, incluso si el log-spam es molesto ... sin embargo, incluso podría ser posible agregar un patrón de exclusión de expresiones regulares a logcat y simplemente filtrar ese mensaje de registro.
Martin Zeitler
minSdkVersion 28 es definitivamente demasiado alto para la mayor parte de la APLICACIÓN
Wu Yuan Chun
@WuYuanChun, esta no era la pregunta, y esta es la única respuesta que en realidad oculta el problema.
Martin Zeitler
Para aclarar: cambiar minSDK a 28 da como resultado una aplicación que no se ejecutará en dispositivos más antiguos. ¿Correcto? Si es así, debería estar en la respuesta como una advertencia destacada.
ToolmakerSteve
-5

Puede evitarlo porque esa clase específica solo en Android 9.

Jonathan
fuente
1
¿Podría dar más información? Será de gran ayuda.
Mohan Rex
3
Consulte developer.android.com/reference/android/view/… . Parece que este es un error en el que android.support.v4.view.ViewCompat no implementa una interfaz esperada.
AL Flanagan
4
(Por encima de la clase es ==> androidx.core.view.ViewCompat) Hay un informe de error issuetracker.google.com/issues/110162198 que está marcado como "no se puede duplicar". Es posible que desee considerar la posibilidad de presentar un informe de error con toda la información necesaria para reproducir el problema.
AL Flanagan
Gracias por la referencia, extendí el problema en el rastreador con mi código con la esperanza de que puedan reproducirlo.
findusl