AndroidX: Appcompat I: lỗi art android.view.View $ OnUnhandledKeyEventListener


104

Trong một dự án mới được tạo với Androidx: appcompat: appcompat: 1.0.0-rc01, tôi nhận được

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

Tôi cũng đã thêm config.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ều này không ảnh hưởng đến chức năng ứng dụng hoặc sự cố. Nhưng nó luôn gặp lỗi này khi ứng dụng đang chạy. Vui lòng giúp tôi giải quyết lỗi. Toàn bộ dấu vết ngăn xếp như sau.

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
Tôi có cùng một lỗi. Bạn đã tìm thấy bất kỳ giải pháp thay thế nào chưa?
c0nst 13/09/18

Không, tôi không tìm thấy bất kỳ giải pháp nào.
Mohan Rex

1
Tôi đang gặp lỗi tương tự nhưng không phải 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;. Đây có phải là một nguyên nhân khác?
Dale

@Mohan Rex Vui lòng giúp tôi cách khắc phục sự cố này?
Garg's

Điều duy nhất giúp tôi là thay thế AppCompatActivity mở rộng bằng Chỉ Hoạt động trong tất cả các hoạt động của tôi. Ví dụ: lớp công khai MainActivity mở rộng Hoạt động. Không có gì khác làm việc cho tôi. Sau này cảnh báo là ra đi vì nó có liên quan đến AppCompat trong android X. Tuy nhiên, không phải là giải pháp tốt nhất cho tương thích
Darksymphony

Câu trả lời:


87

Như ALFlanagan đã đề cập trong một bình luận, vấn đề là android.support.v4.view.ViewCompatkhông triển khai View.OnUnhandledKeyEventListenertrong cấu trúc gói androidx mới và chỉ triển khai nó bắt đầu từ API 28 trong cấu trúc lib hỗ trợ (ít nhất là trong phiên bản 28.0.0). Do đó, cảnh báo xuất hiện trên các thiết bị có API <28 và không xuất hiện trên những thiết bị> = 28.

Đây là mã liên quan trong ViewCompat.classlớp từ cấu trúc gói hỗ trợ:

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

Tôi không thể nghĩ về bất kỳ sửa chữa dễ dàng nào để giải quyết cảnh báo này.


14
Vấn đề đã được đánh dấu là sẽ không khắc phục được và không ai quan tâm đến việc đưa ra lời giải thích hoặc cách giải quyết.
Lẻ

4
Có vẻ như lỗi đã được gửi lại tại đây Issuetracker.google.com/issues/120750246
aaronmarino 19/1218

2
Chà, ứng dụng của tôi hoàn toàn không hoạt động và tôi chỉ thấy lỗi này trên bản gỡ lỗi của mình (Logcat). Ứng dụng không bị lỗi, nhưng "contentView" cũng không được cập nhật, để lại một màn hình trống.
Iúri dos Anjos

1
Tôi đang gặp sự cố tương tự .. Nó không bị treo nhưng chế độ xem đang có một số hành vi không mong muốn. Nó bắt đầu xảy ra ngay sau khi tôi nâng cấp sdk biên dịch lên 28 từ 27.
Amit Kumar

2
Đây là một vụ tai nạn thời gian chạy trên mọi thiết bị với API <26
John Sardinha


0

Tôi nghĩ rằng đây là một lỗi trong androidx. Tôi đã tìm thấy lỗi gây ra độ trễ trong các bản dựng gỡ lỗi nhưng không hiển thị hoặc làm chậm các bản dựng sản xuất nên hiện tại tôi đã bỏ qua nó.


Tôi đã sử dụng AppCompatActivity :(. Nhưng lỗi xuất hiện.
Mohan Rex

1
@MohanRex - chính xác, thông báo này xuất hiện khi sử dụng AppCompatActivity. Tuy nhiên, người ta nên sử dụng AppCompatActivity - chỉ cần bỏ qua sự khó chịu vô hại này.
ToolmakerSteve

0

bạn có thể sử dụng khía cạnhJ để vô hiệu hóa vấn đề này bằng cách sửa đổi mã 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();
        }
    }
}

Bạn có thể vui lòng giải thích cách làm cho AspectJ hoạt động với Android Studio 3.6.3 không. Tôi gặp lỗi này khi tạo mẫu "Hoạt động cơ bản" bằng compileSdkVersion 28, buildToolsVersion 29.0.3, minSdkVersion 16, targetSdkVersion 28.
kbro

-2

Các câu trả lời trên đều đúng. Cách duy nhất để tránh điều này là xóa các tham chiếu đến AppCompat - ví dụ: tôi đã đổi thành FragmentActivity. Tin buồn là các thư viện tài liệu mới đều tham khảo và trải nghiệm sự cố. Tôi không muốn điều này xảy ra với công ty khởi nghiệp của mình - sau này không quá tệ. Nó chỉ là một cảnh báo - nhưng có tác động đến hiệu suất và nó khá không có thật và được xử lý kém bởi G lớn.


1
Re "Tôi đã đổi thành FragmentActivity" . Không phải là một ý kiến ​​hay - điều đó có nghĩa là ứng dụng của bạn sẽ không chạy trên các thiết bị cũ hơn. Ở lại với AppCompat. Re "Đó chỉ là một cảnh báo - nhưng có tác động đến hiệu suất" - để làm rõ, bất kỳ tác động hiệu suất nào là không đáng kể đối với bản phát hành; điều này chủ yếu là một sự khó chịu, thêm sự lộn xộn gần đầu của nhật ký gỡ lỗi.
ToolmakerSteve

-3

Chú thích @RequiresApi(28)thực sự có nghĩa là, build.gradlecấu hình duy nhất có thể giúp một trong những loại bỏ thư rác nhật ký sẽ là nâng minSdkVersiontối thiểu lên 28. Chỉ cần coi nó như một cảnh báo không thể tắt tiếng - không phải là một lỗi.

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

Số phiếu phản đối chỉ chứng minh trang web này phản trí tuệ như thế nào ...


không thể sử dụng được .. bạn không thể mong đợi người dùng chỉ có 28+ những ngày này.
zeroDivider

tốt, đó chỉ là một cảnh báo, ngay cả khi thư rác nhật ký gây phiền nhiễu ... tuy nhiên, thậm chí có thể thêm một mẫu loại trừ regex vào logcat và chỉ cần lọc ra thông báo nhật ký đó.
Martin Zeitler

minSdkVersion 28 chắc chắn là quá cao đối với hầu hết các APP
Wu Yuan Chun

@WuYuanChun đây không phải là câu hỏi - và đây là câu trả lời duy nhất thực sự che giấu vấn đề.
Martin Zeitler

Để làm rõ: việc thay đổi minSDK thành 28 dẫn đến ứng dụng sẽ không chạy trên các thiết bị cũ hơn. Đúng? Nếu vậy, điều đó nên có trong câu trả lời như một cảnh báo nổi bật.
ToolmakerSteve

-5

Bạn có thể tránh nó vì lớp cụ thể đó chỉ có trong Android 9.


1
Bạn có thể vui lòng cung cấp thêm thông tin. Nó sẽ rất có ích.
Mohan Rex

3
Xem developer.android.com/reference/android/view/… . Có vẻ như đây là lỗi khiến android.support.v4.view.ViewCompat không triển khai giao diện mong đợi.
AL Flanagan

4
(Lớp trên là ==> androidx.core.view.ViewCompat) Có một báo cáo lỗi Issuetracker.google.com/issues/110162198 được đánh dấu là "không thể trùng lặp". Bạn có thể muốn xem xét gửi báo cáo lỗi với tất cả thông tin cần thiết để tái tạo vấn đề.
AL Flanagan,

Thx để tham khảo, tôi đã mở rộng vấn đề trong trình theo dõi bằng mã của mình với hy vọng họ có thể tái tạo nó.
findusl
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.