AndroidX : Appcompat I : art 오류 android.view.View $ OnUnhandledKeyEventListener


105

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
비슷하지만 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;합니다. 이것은 다른 원인입니까?
Dale

@Mohan Rex이 문제를 해결하는 방법을 도와주세요.
Garg 's

1
나를 도운 유일한 것은 내 모든 활동에서 AppCompatActivity를 활동으로 확장하는 것입니다. 예를 들어 공용 클래스 MainActivity는 활동을 확장합니다. 다른 것은 나를 위해 일하지 않았습니다. 그것은, 그러나 안드로이드 X에서 APPCOMPAT와 관련된 이전 버전과의 호환성을 위해하지 최적의 솔루션으로이 후 경고가 사라입니다
Darksymphony

답변:


88

ALFlanagan이 의견에서 언급했듯이 문제는 새로운 androidx 패키지 구조에서 android.support.v4.view.ViewCompat구현되지 않고 View.OnUnhandledKeyEventListener지원 lib 구조 (최소 버전 28.0.0에서)의 API 28에서 시작해서 만 구현한다는 것입니다. 따라서 경고는 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);
    }
}

이 경고를 해결하기위한 쉬운 해결책은 생각할 수 없습니다.


14
문제가 해결되지 않음 으로 표시되었으며 아무도 설명이나 해결 방법을 제공 하지 않았습니다 .
Odys

4
버그가 여기에 다시 제출 된 것 같습니다 issuetracker.google.com/issues/120750246
aaronmarino

2
음, 내 앱이 전혀 작동하지 않고 디버그 (Logcat)에서이 오류가 표시됩니다. 앱이 충돌하지 않지만 "contentView"도 업데이트되지 않아 빈 화면이 남습니다.
Iúri dos Anjos

1
나는 같은 문제가있다 .. 그것은 충돌하지 않지만보기에 예기치 않은 동작이있다. 나는 27에서 28로 컴파일 SDK를 업그레이드로 즉시 발생하기 시작이야
아 미트 쿠마르

2
이것은 API가 <26 인 모든 장치에서 런타임 충돌입니다
John Sardinha


0

나는 이것이 androidx의 버그라고 생각합니다. 오류로 인해 디버그 빌드에서 지연이 발생하지만 프로덕션 빌드가 표시되거나 느려지지 않으므로 지금은 무시했습니다.


이미 :( AppCompatActivity를 사용하지만 오류가 나타납니다 있어요..
모한 렉스

1
@MohanRex-정확히이 메시지는 AppCompatActivity를 사용할 때 나타납니다. 그럼에도 불구하고 AppCompatActivity를 사용해야 합니다.이 무해한 성가심은 무시하십시오.
ToolmakerSteve

0

aspectJ를 사용하여 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을 사용하여 "Basic Activity"템플릿을 빌드 할 때이 오류가 발생합니다.
kbro

-2

위의 답변이 정확합니다. 이를 방지하는 유일한 방법은 AppCompat에 대한 참조를 제거하는 것입니다. 예를 들어 FragmentActivity로 변경했습니다. 나쁜 소식은 새로운 재료 라이브러리가 모두 참조하고 문제를 경험한다는 것입니다. 나는 이것이 나의 스타트 업에서 발생하는 것을 원하지 않았다-히트는 나중에 그렇게 나쁘지 않다. 경고 일 뿐이지 만 성능에 영향을 미치며 꽤 가짜이며 큰 G에 의해 제대로 처리되지 않습니다.


1
Re "I changed to FragmentActivity" . 좋은 생각이 아닙니다. 즉, 앱이 이전 기기에서 실행되지 않습니다. AppCompat과 함께하십시오. Re "단지 경고 일뿐 성능에 영향을 미칩니다" -명확히하기 위해 릴리스 빌드에서 성능에 미치는 영향은 무시할 수 있습니다. 이것은 주로 성가신 일이며 디버그 로그 시작 부분에 혼란을 추가합니다.
ToolmakerSteve

-3

주석은 @RequiresApi(28)실제로 build.gradle로그 스팸을 제거 하는 유일한 구성은를 minSdkVersion최소한 으로 올리는 것임을 의미합니다 28. 오류가 아니라 음소거 할 수없는 경고로 간주하십시오.

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

반대표는이 사이트가 얼마나 반 지적인지 증명할뿐입니다.


별로 쓸모가 없어요 .. 요즘에는 사용자가 28 명 이상을 가질 것이라고 기대할 수 없습니다.
zeroDivider

음, 로그 스팸이 성가신 경우에도 경고 일뿐입니다 ... 그럼에도 불구하고 logcat에 정규식 제외 패턴을 추가하고 단순히 해당 로그 메시지를 필터링하는 것이 가능할 수도 있습니다.
Martin Zeitler

의 minSdkVersion (28)는 APP의 대부분을 너무 높게 확실히
우 위안 춘

@WuYuanChun 이것은 질문이 아니었고 이것이 실제로 문제를 숨기는 유일한 대답입니다.
Martin Zeitler 2019

명확히하기 위해 : minSDK를 28로 변경하면 앱이 이전 기기에서 실행되지 않습니다. 권리? 그렇다면 눈에 띄는 경고로 대답해야합니다.
ToolmakerSteve

-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입니다.) '복제 할 수 없음'으로 표시된 버그 보고서 issuetracker.google.com/issues/110162198 이 있습니다. 문제를 재현하는 데 필요한 모든 정보와 함께 버그 보고서를 제출하는 것을 고려할 수 있습니다.
AL Flanagan

참조를 위해 Thx, 나는 그들이 그것을 재현 할 수 있기를 희망하면서 내 코드로 추적기의 문제를 확장했습니다.
findusl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.