AndroidX: Appcompat I: kesalahan seni android.view.View $ OnUnhandledKeyEventListener

105

Dalam proyek yang baru dibuat dengan Androidx: appcompat: appcompat: 1.0.0-rc01, saya mendapatkan file

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

Saya juga menambahkan 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.+"
            }
        }
    }
}

Yang ini tidak memengaruhi fungsionalitas aplikasi atau crash. Tetapi selalu ada kesalahan ini saat aplikasi berjalan. Mohon bantu saya untuk mengatasi kesalahan tersebut. Seluruh jejak tumpukan adalah sebagai berikut.

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
sumber
1
Saya mempunyai kesalahan yang sama. Apakah Anda sudah menemukan solusi?
c0nst
Tidak, saya belum menemukan solusi apa pun.
Mohan Rex
1
Saya mendapatkan kesalahan serupa tetapi bukan 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;. Apakah ini penyebab yang berbeda?
Dale
@Mohan Rex Tolong bantu saya bagaimana memperbaiki masalah ini?
Garg
1
Satu-satunya hal yang membantu saya adalah mengganti extends AppCompatActivity dengan hanya Activity di semua aktivitas saya. Misalnya kelas publik MainActivity memperluas Aktivitas. Tidak ada yang berhasil untuk saya. Setelah ini peringatan hilang karena terkait dengan AppCompat di android X. Namun, bukan solusi terbaik untuk kompatibilitas mundur
Darksymphony

Jawaban:

88

Seperti yang disebutkan ALFlanagan dalam komentar, masalahnya adalah android.support.v4.view.ViewCompattidak diimplementasikan View.OnUnhandledKeyEventListenerdalam struktur paket androidx baru dan hanya mengimplementasikannya mulai dari API 28 dalam struktur dukungan lib (setidaknya dalam versi 28.0.0). Oleh karena itu, peringatan muncul pada perangkat dengan API <28 dan tidak muncul pada perangkat> = 28 tersebut.

Ini adalah kode terkait di ViewCompat.classkelas dari struktur paket dukungan:

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

Saya tidak dapat memikirkan perbaikan yang mudah untuk mengatasi peringatan ini.

AlvaroSantisteban
sumber
14
Masalah ini telah ditandai sebagai tidak akan diperbaiki dan tidak ada yang peduli untuk memberikan penjelasan atau solusi.
Odys
4
Sepertinya bug tersebut telah diajukan kembali di sini issuetracker.google.com/issues/120750246
aaronmarino
2
Nah, aplikasi saya tidak berfungsi sama sekali dan saya hanya melihat kesalahan ini di debug saya (Logcat). Aplikasi tidak mogok, tetapi "contentView" juga tidak diperbarui, meninggalkan layar kosong.
Iúri dos Anjos
1
Saya mengalami masalah yang sama .. Tampilan tidak mogok tetapi tampilan mengalami perilaku yang tidak terduga. Ini mulai terjadi segera setelah saya mengupgrade sdk kompilasi ke 28 dari 27.
Amit Kumar
2
Ini adalah error runtime di setiap perangkat dengan API <26
John Sardinha
0

Saya rasa ini adalah bug di androidx. Saya telah menemukan kesalahan yang menyebabkan kelambatan dalam pembuatan debug tetapi tidak menunjukkan atau memperlambat pembangunan produksi jadi saya baru saja mengabaikannya untuk saat ini.

Bob bobbington
sumber
Saya sudah menggunakan AppCompatActivity :(. Namun kesalahan muncul.
Mohan Rex
1
@MohanRex - tepatnya, pesan ini muncul saat menggunakan AppCompatActivity. Namun demikian, seseorang harus menggunakan AppCompatActivity - abaikan saja gangguan yang tidak berbahaya ini.
ToolmakerSteve
0

Anda dapat menggunakan aspekJ untuk membatalkan masalah ini dengan memodifikasi kode 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();
        }
    }
}
包 奇 锋
sumber
Bisakah Anda menjelaskan cara membuat AspectJ bekerja dengan Android Studio 3.6.3. Saya mendapatkan error ini karena membuat template "Basic Activity" menggunakan compileSdkVersion 28, buildToolsVersion 29.0.3, minSdkVersion 16, targetSdkVersion 28.
kbro
-2

Jawaban di atas benar. Satu-satunya cara untuk menghindarinya adalah dengan menghapus referensi ke AppCompat - misalnya saya berubah menjadi FragmentActivity. Kabar buruknya adalah perpustakaan materi baru semua referensi dan mengalami masalah. Saya tidak ingin ini terjadi pada startup saya - hitnya tidak terlalu buruk di kemudian hari. Ini hanya peringatan - tetapi memiliki dampak kinerja dan itu cukup palsu dan ditangani dengan buruk oleh G. yang besar.

Daniel Haywood
sumber
1
Re "Saya berubah menjadi FragmentActivity" . Bukan ide yang bagus - itu berarti aplikasi Anda tidak akan berjalan di perangkat yang lebih lama. Tetap menggunakan AppCompat. Re "Ini hanya peringatan - tetapi memiliki dampak kinerja" - untuk memperjelas, setiap dampak kinerja dapat diabaikan pada rilis build; ini terutama merupakan gangguan, menambahkan kekacauan di dekat awal log debug.
ToolmakerSteve
-3

Anotasi @RequiresApi(28)sebenarnya berarti, bahwa satu-satunya build.gradlekonfigurasi yang akan menyingkirkan satu log-spam adalah dengan menaikkan minSdkVersionmenjadi setidaknya 28. Anggap saja itu sebagai peringatan yang tidak dapat diredam - bukan kesalahan.

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

Suara negatif hanya membuktikan betapa anti-intelektual situs ini ...

Martin Zeitler
sumber
tidak begitu berguna .. Anda tidak dapat mengharapkan pengguna hanya memiliki 28+ hari ini.
zeroDivider
yah, ini hanya peringatan, meskipun log-spam mengganggu ... meskipun demikian, mungkin saja menambahkan pola pengecualian regex ke logcat dan cukup memfilter pesan log itu.
Martin Zeitler
minSdkVersion 28 pasti terlalu tinggi untuk sebagian besar APP
Wu Yuan Chun
@WuYuanChun ini bukanlah pertanyaannya - dan ini adalah satu-satunya jawaban yang sebenarnya menyembunyikan masalah.
Martin Zeitler
Untuk memperjelas: mengubah minSDK ke 28 menghasilkan aplikasi yang tidak akan berjalan di perangkat yang lebih lama. Baik? Jika demikian, jawaban itu harus menjadi peringatan yang menonjol.
ToolmakerSteve
-5

Anda bisa menghindarinya karena kelas khusus itu hanya ada di Android 9.

Jonathan
sumber
1
Bisakah Anda memberi informasi lebih lanjut. Ini akan sangat membantu.
Mohan Rex
3
Lihat developer.android.com/reference/android/view/… . Sepertinya ini adalah bug di mana android.support.v4.view.ViewCompat tidak mengimplementasikan antarmuka yang diharapkan.
AL Flanagan
4
(Kelas di atas ==> androidx.core.view.ViewCompat) Ada laporan bug Issuetracker.google.com/issues/110162198 yang ditandai "tidak dapat menduplikasi". Anda mungkin ingin mempertimbangkan untuk mengajukan laporan bug dengan semua informasi yang diperlukan untuk mereproduksi masalah.
AL Flanagan
Terima kasih untuk referensi, saya memperpanjang masalah di pelacak dengan kode saya dengan harapan mereka dapat mereproduksinya.
findusl