AndroidX: Appcompat I: errore artistico android.view.View $ OnUnhandledKeyEventListener


105

In un progetto appena creato con Androidx: appcompat: appcompat: 1.0.0-rc01, ottengo il file

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

Avevo anche aggiunto 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.+"
            }
        }
    }
}

Questo non influisce sulla funzionalità dell'app o si arresta in modo anomalo. Ma ha sempre questo errore quando l'app è in esecuzione. Gentilmente aiutami a risolvere l'errore. L'intera traccia dello stack è la seguente.

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)

1
Ho lo stesso errore. Hai trovato soluzioni alternative?
c0nst

No, non ho trovato alcuna soluzione alternativa.
Mohan Rex

1
Ricevo un errore simile ma non 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;. È una causa diversa?
Dale

@ Mohan Rex Per favore aiutami a risolvere questo problema?
Garg's

1
L'unica cosa che mi ha aiutato è sostituire extends AppCompatActivity con solo Activity in tutte le mie attività. Ad esempio, la classe pubblica MainActivity estende Activity. Nient'altro ha funzionato per me. Dopodiché l'avviso è scomparso poiché è correlato ad AppCompat in Android X. Tuttavia, non è la soluzione migliore per la compatibilità con le versioni precedenti
Darksymphony

Risposte:


88

Come ALFlanagan ha menzionato in un commento, il problema è che android.support.v4.view.ViewCompatnon viene implementato View.OnUnhandledKeyEventListenernella nuova struttura del pacchetto androidx e lo implementa solo a partire dall'API 28 nella struttura della libreria di supporto (almeno nella versione 28.0.0). Pertanto l'avviso compare sui dispositivi con API <28 e non compare su quelli> = 28.

Questo è il codice correlato nella ViewCompat.classclasse dalla struttura del pacchetto di supporto:

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

Non riesco a pensare a una soluzione semplice per risolvere questo avvertimento.


14
Il problema è stato contrassegnato come non risolto e nessuno si è preoccupato di fornire una spiegazione o una soluzione alternativa.
Odys

4
Sembra che il bug sia stato ripresentato qui issuetracker.google.com/issues/120750246
aaronmarino

2
Bene, la mia app non funziona affatto e vedo questo errore sul mio debug (Logcat). L'app non si blocca, ma anche "contentView" non viene aggiornato, lasciando uno schermo vuoto.
Iúri dos Anjos

1
Sto riscontrando lo stesso problema .. Non si blocca ma la vista sta avendo un comportamento imprevisto. Ha iniziato a succedere non appena ho aggiornato l'SDK di compilazione a 28 dal 27.
Amit Kumar

2
Si tratta di un arresto anomalo del runtime su ogni dispositivo con API <26
John Sardinha


0

Penso che questo sia un bug in androidx. Ho scoperto che l'errore causa ritardi nelle build di debug ma non mostra o rallenta le build di produzione, quindi per ora l'ho ignorato.


Sto già utilizzando AppCompatActivity :(. Ma viene visualizzato l'errore.
Mohan Rex

1
@MohanRex - esattamente, questo messaggio viene visualizzato quando si utilizza AppCompatActivity. Tuttavia, si dovrebbe usare AppCompatActivity - basta ignorare questo fastidio innocuo.
ToolmakerSteve

0

puoi usare aspectJ per annullare questo problema modificando il codice byte 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();
        }
    }
}

Puoi spiegare come far funzionare AspectJ con Android Studio 3.6.3. Ricevo questo errore dopo aver creato il modello "Attività di base" utilizzando compileSdkVersion 28, buildToolsVersion 29.0.3, minSdkVersion 16, targetSdkVersion 28.
kbro

-2

Le risposte di cui sopra sono corrette. L'unico modo per evitare ciò è rimuovere i riferimenti ad AppCompat, ad esempio ho cambiato in FragmentActivity. La cattiva notizia è che le nuove librerie di materiali fanno riferimento e sperimentano il problema. Non volevo che ciò accadesse al mio avvio: il successo non è poi così male in seguito. È solo un avvertimento, ma ha un impatto sulle prestazioni ed è piuttosto fasullo e mal gestito dal grande G.


1
Ri "Ho cambiato in FragmentActivity" . Non è una buona idea: significa che la tua app non funzionerà su dispositivi meno recenti. Resta con AppCompat. Ri "È solo un avvertimento - ma ha un impatto sulle prestazioni" - per chiarire, qualsiasi impatto sulle prestazioni è trascurabile sulla build di rilascio; questo è principalmente un fastidio, aggiungendo confusione all'inizio del registro di debug.
ToolmakerSteve

-3

L'annotazione in @RequiresApi(28)realtà significa che l'unica build.gradleconfigurazione che eliminerebbe il log-spam sarebbe quella di aumentare il valore minSdkVersionalmeno a 28. Consideralo solo come un avviso che non può essere disattivato, non come un errore.

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

I voti negativi dimostrano quanto sia anti-intellettuale questo sito ...


non così utilizzabile .. non puoi aspettarti che gli utenti abbiano solo 28+ in questi giorni.
zeroDivider

beh, è ​​solo un avvertimento, anche se il log-spam è fastidioso ... tuttavia potrebbe anche essere possibile aggiungere un pattern di esclusione regex a logcat e filtrare semplicemente quel messaggio di log.
Martin Zeitler

minSdkVersion 28 è decisamente troppo alto per la maggior parte di APP
Wu Yuan Chun

@WuYuanChun questa non era la domanda - e questa è l'unica risposta che effettivamente nasconde il problema.
Martin Zeitler

Per chiarire: la modifica di minSDK a 28 risulta in un'app che non verrà eseguita sui dispositivi meno recenti. Destra? Se è così, dovrebbe essere nella risposta un avvertimento evidente.
ToolmakerSteve

-5

Puoi evitarlo perché quella classe specifica solo in Android 9.


1
Potresti fornire maggiori informazioni. Sarebbe di grande aiuto.
Mohan Rex

3
Vedi developer.android.com/reference/android/view/… . Sembra che questo sia un bug in cui android.support.v4.view.ViewCompat non implementa un'interfaccia prevista.
AL Flanagan

4
(La classe sopra è ==> androidx.core.view.ViewCompat) C'è una segnalazione di bug issuetracker.google.com/issues/110162198 contrassegnata come "impossibile duplicare". Potresti prendere in considerazione l'idea di presentare una segnalazione di bug con tutte le informazioni necessarie per riprodurre il problema.
AL Flanagan

Grazie per il riferimento, ho esteso il problema nel tracker con il mio codice nella speranza che possano riprodurlo.
findusl
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.