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


109

ในโครงการที่สร้างขึ้นใหม่ด้วย Androidx: appcompat: appcompat: 1.0.0-rc01 ฉันได้รับไฟล์

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

ฉันได้เพิ่ม 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.+"
            }
        }
    }
}

สิ่งนี้ไม่มีผลต่อการทำงานของแอพหรือข้อขัดข้อง แต่มักจะมีข้อผิดพลาดนี้เสมอเมื่อแอปกำลังทำงาน กรุณาช่วยฉันแก้ไขข้อผิดพลาด การติดตามสแต็กทั้งหมดมีดังนี้

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
ฉันมีข้อผิดพลาดเดียวกัน คุณพบวิธีแก้ปัญหาหรือไม่?
c0nst

ไม่ฉันไม่พบวิธีแก้ปัญหาใด ๆ
Mohan Rex

1
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;ฉันได้รับข้อผิดพลาด AndroidX คล้ายกัน แต่ไม่ใช่ เป็นสาเหตุที่แตกต่างกันหรือไม่?
Dale

@ Mohan Rex โปรดช่วยฉันแก้ไขปัญหานี้ได้อย่างไร
Garg's

1
สิ่งเดียวที่ช่วยฉันได้คือการแทนที่ AppCompatActivity ด้วยเพียงแค่กิจกรรมในกิจกรรมทั้งหมดของฉัน เช่น MainActivity คลาสสาธารณะขยายกิจกรรม ไม่มีอะไรอื่นที่ใช้ได้ผลสำหรับฉัน หลังจากนี้คำเตือนจะหายไปเนื่องจากเกี่ยวข้องกับ AppCompat ใน Android X อย่างไรก็ตามไม่ใช่ทางออกที่ดีที่สุดสำหรับความเข้ากันได้แบบย้อนหลัง
Darksymphony

คำตอบ:


92

ดังที่ ALFlanagan กล่าวไว้ในความคิดเห็นปัญหาคือandroid.support.v4.view.ViewCompatไม่ได้นำไปใช้View.OnUnhandledKeyEventListenerในโครงสร้างแพ็คเกจ androidx ใหม่และดำเนินการเฉพาะที่เริ่มต้นบน API 28 ในโครงสร้างสนับสนุน lib (อย่างน้อยในเวอร์ชัน 28.0.0) ดังนั้นคำเตือนจึงปรากฏบนอุปกรณ์ที่มี API <28 และไม่ปรากฏในอุปกรณ์เหล่านั้น> = 28

นี่คือรหัสที่เกี่ยวข้องในViewCompat.classคลาสจากโครงสร้างแพ็คเกจการสนับสนุน:

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

ฉันไม่สามารถคิดเกี่ยวกับการแก้ไขง่ายๆเพื่อแก้คำเตือนนี้


19
ปัญหานี้ถูกทำเครื่องหมายว่าไม่สามารถแก้ไขได้และไม่มีใครสนใจที่จะให้คำอธิบายหรือวิธีแก้ไขปัญหา
Odys

5
ดูเหมือนว่าจะมีการส่งข้อผิดพลาดอีกครั้งที่นี่issueetracker.google.com/issues/120750246
aaronmarino

2
แอพของฉันใช้งานไม่ได้เลยและฉันเพิ่งเห็นข้อผิดพลาดนี้ในการดีบัก (Logcat) แอปไม่ขัดข้อง แต่ยังไม่มีการอัปเดต "contentView" โดยปล่อยให้หน้าจอว่างเปล่า
Iúri dos Anjos

1
ฉันมีปัญหาเดียวกัน .. มันไม่ได้ขัดข้อง แต่มุมมองมีพฤติกรรมที่ไม่คาดคิด มันเริ่มเกิดขึ้นทันทีที่ฉันอัพเกรด sdk คอมไพล์เป็น 28 จาก 27
Amit Kumar

4
นี่คือความผิดพลาดของรันไทม์ในทุกอุปกรณ์ที่มี API <26
John Sardinha

9

ฉันกำลังประสบปัญหาเดียวกัน แต่เพิ่งพยายามอัปเกรดการอ้างอิงสำหรับ appcompat และมันใช้งานไม่ได้บันทึกข้อผิดพลาดอีกต่อไป ฉันหวังว่าจะมีรุ่นใหม่ที่เสถียรเร็ว ๆ นี้ https://developer.android.com/jetpack/androidx/releases/appcompat#1.3.0-alpha02

การใช้งาน 'androidx.appcompat: appcompat: 1.3.0-alpha02'


2
การอ้างอิงที่อัปเดตคือ: - การใช้งาน 'androidx.appcompat: appcompat: 1.3.0-alpha02'
Amit Jayaswal

0

คุณสามารถใช้มุมมอง J เพื่อทำให้ปัญหานี้เป็นโมฆะโดยแก้ไขรหัสไบต์ 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();
        }
    }
}

คุณช่วยอธิบายวิธีทำให้ AspectJ ทำงานร่วมกับ Android Studio 3.6.3 ได้ไหม ฉันได้รับข้อผิดพลาดนี้เมื่อสร้างเทมเพลต "กิจกรรมพื้นฐาน" โดยใช้ compileSdkVersion 28, buildToolsVersion 29.0.3, minSdkVersion 16, targetSdkVersion 28
kbro

0

นี่คือบั๊กใน androidx ฉันพบข้อผิดพลาดทำให้เกิดความล่าช้าในการสร้างการแก้ไขข้อบกพร่อง แต่ไม่แสดงหรือชะลอการสร้างการผลิต คุณสามารถเพิกเฉยได้ในตอนนี้


ฉันใช้ AppCompatActivity อยู่แล้ว :( แต่ข้อผิดพลาดปรากฏขึ้น
Mohan Rex

1
@MohanRex ข้อความนี้จะปรากฏขึ้นเมื่อใช้ AppCompatActivity อย่างไรก็ตามควรใช้ AppCompatActivity เพียงแค่เพิกเฉยต่อความน่ารำคาญที่ไม่เป็นอันตรายนี้
ToolmakerSteve

-2

คำตอบด้านบนถูกต้อง วิธีเดียวที่จะหลีกเลี่ยงปัญหานี้คือการลบการอ้างอิงไปยัง AppCompat - เช่นฉันเปลี่ยนเป็น FragmentActivity ข่าวร้ายคือไลบรารีวัสดุใหม่ทั้งหมดอ้างอิงและประสบปัญหา ฉันไม่ต้องการให้สิ่งนี้เกิดขึ้นในการเริ่มต้น - การเข้าชมไม่ได้เลวร้ายในภายหลัง เป็นเพียงคำเตือน - แต่มีผลกระทบต่อประสิทธิภาพและมันค่อนข้างหลอกลวงและจัดการได้ไม่ดีโดย G.


2
เรื่อง"ผมเปลี่ยนไป FragmentActivity" ไม่ใช่ความคิดที่ดีนั่นหมายความว่าแอปของคุณจะไม่ทำงานบนอุปกรณ์รุ่นเก่า อยู่กับ AppCompat Re "เป็นเพียงคำเตือน - แต่มีผลกระทบต่อประสิทธิภาพ" - เพื่อชี้แจงผลกระทบด้านประสิทธิภาพใด ๆ ที่มีอยู่เล็กน้อยในรุ่นรุ่น นี่คือความน่ารำคาญเป็นหลักโดยเพิ่มความยุ่งเหยิงใกล้จุดเริ่มต้นของบันทึกการแก้ไขข้อบกพร่อง
ToolmakerSteve

-3

คำอธิบายประกอบ@RequiresApi(28)จริงหมายถึงว่าเพียงbuild.gradleการกำหนดค่าที่จะได้รับหนึ่งในการกำจัดของการเข้าสู่ระบบสแปมจะเพิ่มอย่างน้อยminSdkVersion28

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

จากตัวติดตามข้อผิดพลาด:

ข้อบกพร่องนี้ถูกปิดโดยจะไม่แก้ไข (พฤติกรรมที่ตั้งใจไว้) ข้อผิดพลาดเหล่านี้สามารถเพิกเฉยได้


2
ไม่สามารถใช้งานได้ .. คุณไม่สามารถคาดหวังว่าผู้ใช้จะมีเพียง 28+ วันนี้
zeroDivider

เป็นเพียงคำเตือนเท่านั้นแม้ว่าล็อกสแปมจะน่ารำคาญ ... อย่างไรก็ตามอาจเป็นไปได้ที่จะเพิ่มรูปแบบการยกเว้น regex ให้กับ logcat และเพียงแค่กรองข้อความบันทึกนั้นออก
Martin Zeitler

2
minSdkVersion 28 สูงเกินไปสำหรับ APP ส่วนใหญ่อย่างแน่นอน
Wu Yuan Chun

1
เพื่อชี้แจง: การเปลี่ยน minSDK เป็น 28 ทำให้แอปไม่ทำงานบนอุปกรณ์รุ่นเก่า ขวา? ถ้าเป็นเช่นนั้นคำตอบควรเป็นคำเตือนที่โดดเด่น
ToolmakerSteve

1
@ToolmakerSteve มันเป็นเพียงความจริงที่น่าเศร้าที่คนส่วนใหญ่ที่นี่เพียงแค่คัดลอกวางและโหวตวิธีแก้ปัญหาที่ง่ายที่สุด (แทนที่จะเป็นวิธีแก้ปัญหา) โดยไม่เข้าใจสิ่งที่พวกเขาคัดลอก - แล้วสงสัยเมื่อพวกเขาประสบปัญหาเพิ่มเติม ถนน. และฉันได้อธิบายว่าทำไมมันถึงเกิดขึ้นและจะทำอย่างไรกับมัน - หรือเพิกเฉยต่อมัน (ดูเหมือนจะไม่สามารถแก้ไขได้ดูเหมือนจะไม่ใช่คำตอบที่ยอมรับได้) ความเข้ากันได้ย้อนหลังไม่ใช่คำถาม 91 โหวตขึ้นโดยไม่มีแนวทางการแก้ปัญหาน้อยที่สุด ...
Martin Zeitler

-5

คุณสามารถหลีกเลี่ยงได้เนื่องจากคลาสเฉพาะนั้นมีเฉพาะใน Android 9


1
โปรดให้ข้อมูลเพิ่มเติม มันจะเป็นประโยชน์มาก
Mohan Rex

3
ดูdeveloper.android.com/reference/android/view/... ดูเหมือนว่านี่จะเป็นข้อบกพร่องที่ android.support.v4.view.ViewCompat ไม่ได้ใช้อินเทอร์เฟซที่คาดไว้
AL Flanagan

4
(ชั้นเรียนด้านบนคือ ==> androidx.core.view.ViewCompat) มีรายงานข้อบกพร่องที่ออกIssetracker.google.com/issues/110162198ซึ่งถูกระบุว่า "ไม่สามารถทำซ้ำได้" คุณอาจต้องการพิจารณายื่นรายงานข้อบกพร่องพร้อมข้อมูลทั้งหมดที่จำเป็นในการทำให้เกิดปัญหาขึ้นอีกครั้ง
AL Flanagan

ขอบคุณสำหรับการอ้างอิงฉันขยายปัญหาในตัวติดตามด้วยรหัสของฉันด้วยความหวังว่าพวกเขาจะสามารถทำซ้ำได้
findusl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.