AndroidX: Appcompat I: błąd grafiki android.view.View $ OnUnhandledKeyEventListener

106

W nowo utworzonym projekcie z Androidx: appcompat: appcompat: 1.0.0-rc01 otrzymuję plik

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

Dodałem również 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.+"
            }
        }
    }
}

Ten nie ma wpływu na funkcjonalność aplikacji ani awarie. Ale zawsze ma ten błąd, gdy aplikacja jest uruchomiona. Prosimy o pomoc w rozwiązaniu błędu. Cały ślad stosu jest następujący.

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
źródło
1
Mam ten sam błąd. Czy znalazłeś jakieś obejście?
c0nst
Nie, nie znalazłem żadnego obejścia.
Mohan Rex,
1
Otrzymuję podobny, ale inny błąd niż 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;. Czy to inna przyczyna?
Dale
@Mohan Rex Proszę, pomóż mi, jak rozwiązać ten problem?
Garg's
1
Jedyne, co mi pomogło, to zastąpienie rozszerzenia AppCompatActivity na Just Activity we wszystkich moich działaniach. Np. Publiczna klasa MainActivity rozszerza Activity. Nic innego nie działało dla mnie. Po tym ostrzeżenie zniknie, ponieważ jest związane z AppCompat w systemie Android X. Jednak nie jest to najlepsze rozwiązanie dla wstecznej kompatybilności
Darksymphony

Odpowiedzi:

89

Jak ALFlanagan wspomniał w komentarzu, problem polega na tym, android.support.v4.view.ViewCompatże nie implementuje się View.OnUnhandledKeyEventListenerw nowej strukturze pakietu androidx i implementuje ją dopiero zaczynając od API 28 w strukturze wsparcia lib (przynajmniej w wersji 28.0.0). Dlatego ostrzeżenie pojawia się na urządzeniach z API <28 i nie pojawia się na tych> = 28.

Oto powiązany kod w ViewCompat.classklasie ze struktury pakietu wsparcia:

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

Nie mogę wymyślić żadnej łatwej metody rozwiązania tego ostrzeżenia.

AlvaroSantisteban
źródło
14
Problem został oznaczony jako nie do naprawienia i nikt nie zadał sobie trudu, aby podać wyjaśnienia ani obejścia.
Odys
4
Wygląda na to, że błąd został ponownie przesłany tutaj issuetracker.google.com/issues/120750246
aaronmarino
2
Cóż, moja aplikacja po prostu w ogóle nie działa i po prostu widzę ten błąd w moim debugowaniu (Logcat). Aplikacja nie ulega awarii, ale „contentView” również nie jest aktualizowany, pozostawiając pusty ekran.
Iúri dos Anjos
1
Mam ten sam problem. Nie ulega awarii, ale widok ma nieoczekiwane zachowanie. Zaczęło się to dziać, gdy tylko zaktualizowałem kompilację SDK do 28 z 27.
Amit Kumar
2
Jest to awaria środowiska uruchomieniowego na każdym urządzeniu z interfejsem API <26
John Sardinha
3

Mam ten sam problem, ale właśnie próbowałem zaktualizować zależność dla appcompat i nie działało więcej dzienników błędów. Mam nadzieję, że wkrótce pojawi się nowe stabilne wydanie. https://developer.android.com/jetpack/androidx/releases/appcompat#1.3.0-alpha01

implementacja „androidx.appcompat: appcompat: 1.3.0-alpha02”

Vishal Pawar
źródło
1
Zaktualizowana zależność to: - implementacja „androidx.appcompat: appcompat: 1.3.0-alpha02”
Amit Jayaswal
zaktualizowane w odpowiedzi.
Vishal Pawar
0

Myślę, że to błąd w Androidx. Zauważyłem, że błąd powoduje opóźnienie w kompilacjach debugowania, ale nie wyświetla ani nie spowalnia kompilacji produkcyjnych, więc na razie go zignorowałem.

Bob Bobbington
źródło
Już używam AppCompatActivity :(. Ale pojawia się błąd.
Mohan Rex
1
@MohanRex - dokładnie, ten komunikat pojawia się podczas korzystania z AppCompatActivity. Niemniej jednak należy używać AppCompatActivity - po prostu zignoruj ​​tę nieszkodliwą irytację.
ToolmakerSteve
0

Możesz użyć aspektuJ, aby usunąć ten problem, modyfikując kod bajtowy 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();
        }
    }
}
包 奇 锋
źródło
Czy możesz wyjaśnić, jak sprawić, by AspectJ działał z Android Studio 3.6.3. Otrzymuję ten błąd po utworzeniu szablonu „Basic Activity” przy użyciu compileSdkVersion 28, buildToolsVersion 29.0.3, minSdkVersion 16, targetSdkVersion 28.
kbro
-2

Powyższe odpowiedzi są prawidłowe. Jedynym sposobem uniknięcia tego jest usunięcie odwołań do AppCompat - np. Zmieniłem na FragmentActivity. Zła wiadomość jest taka, że ​​wszystkie nowe biblioteki materiałów odnoszą się do problemu i doświadczają go. Nie chciałem, żeby to działo się na moim starcie - hit nie jest później taki zły. To tylko ostrzeżenie - ale ma wpływ na wydajność i jest dość fałszywe i źle obsługiwane przez duże G.

Daniel Haywood
źródło
1
Re „Zmieniłem na FragmentActivity” . Nie jest to dobry pomysł - oznacza to, że Twoja aplikacja nie będzie działać na starszych urządzeniach. Pozostań z AppCompat. Odp. „To tylko ostrzeżenie - ale ma wpływ na wydajność” - aby wyjaśnić, jakikolwiek wpływ na wydajność jest pomijalny w kompilacji wydania; jest to głównie irytujące, powodujące bałagan w pobliżu początku dziennika debugowania.
ToolmakerSteve
-3

Adnotacja @RequiresApi(28)faktycznie oznacza, że ​​jedyną build.gradlekonfiguracją, która pozwoliłaby pozbyć się spamu logowego, byłoby podniesienie minSdkVersionco najmniej do 28. Potraktuj to tylko jako ostrzeżenie, którego nie można wyciszyć - a nie błąd.

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

Głosy w dół tylko dowodzą, jak antyintelektualna jest ta strona ...

Martin Zeitler
źródło
nie tak użyteczne ... nie można oczekiwać, że użytkownicy mają obecnie tylko 28+.
zeroDivider
cóż, to tylko ostrzeżenie, nawet jeśli spam w dzienniku jest denerwujący ... niemniej jednak może nawet być możliwe dodanie wzorca wykluczenia wyrażenia regularnego do logcat i po prostu odfiltrowanie tego komunikatu dziennika.
Martin Zeitler,
minSdkVersion 28 jest zdecydowanie za wysoka dla większości aplikacji
Wu Yuan Chun
@WuYuanChun to nie było pytanie - i jest to jedyna odpowiedź, która faktycznie ukrywa problem.
Martin Zeitler
Dla wyjaśnienia: zmiana minSDK na 28 powoduje, że aplikacja nie będzie działać na starszych urządzeniach. Dobrze? Jeśli tak, to powinno być to wyraźne ostrzeżenie.
ToolmakerSteve
-5

Możesz tego uniknąć, ponieważ ta konkretna klasa tylko w systemie Android 9.

Jonathan
źródło
1
Czy mógłbyś podać więcej informacji. To będzie bardzo pomocne.
Mohan Rex
3
Zobacz developer.android.com/reference/android/view/… . Wygląda na to, że jest to błąd, w którym android.support.v4.view.ViewCompat nie implementuje oczekiwanego interfejsu.
AL Flanagan
4
(Powyższa klasa to ==> androidx.core.view.ViewCompat) Istnieje raport o błędzie issuetracker.google.com/issues/110162198, który jest oznaczony jako „nie można powielić”. Możesz rozważyć zgłoszenie błędu, zawierające wszystkie informacje potrzebne do odtworzenia problemu.
AL Flanagan,
Dzięki dla odniesienia, rozszerzyłem problem w trackerze o mój kod w nadziei, że będą mogli go odtworzyć.
findusl