AndroidX: Appcompat I: художественная ошибка android.view.View $ OnUnhandledKeyEventListener

107

Во вновь созданном проекте с 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;. Это другая причина?
Дейл
@ Mohan Rex Помогите мне, пожалуйста, как решить эту проблему?
Garg
1
Единственное, что мне помогло, - это заменить extends AppCompatActivity только Activity во всех моих действиях. Например, открытый класс MainActivity расширяет Activity. Больше у меня ничего не работало. После этого предупреждение исчезнет, ​​так как оно связано с AppCompat в Android X. Однако это не лучшее решение для обратной совместимости
Darksymphony

Ответы:

90

Как упомянул 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);
    }
}

Я не могу придумать какое-либо простое решение для устранения этого предупреждения.

АльвароСантистебан
источник
15
Проблема была помечена как не решаемая, и никто не позаботился дать объяснение или способ решения.
Odys
4
Похоже, ошибка была повторно отправлена ​​здесь Issuesetracker.google.com/issues/120750246
aaronmarino
2
Что ж, мое приложение просто вообще не работает, и я просто вижу эту ошибку при отладке (Logcat). Приложение не аварийно завершает работу, но «contentView» также не обновляется, оставляя пустой экран.
Iúri dos Anjos
1
У меня такая же проблема ... Не происходит сбоев, но у view есть неожиданное поведение. Это начало происходить, как только я обновил sdk компиляции до 28 с 27.
Амит Кумар
2
Это сбой во время выполнения на каждом устройстве с API <26
Джон Сардинья
4

У меня такая же проблема, но я просто попытался обновить зависимость для appcompat, и журналы ошибок больше не работали. Надеюсь, скоро выйдет новый стабильный релиз. https://developer.android.com/jetpack/androidx/releases/appcompat#1.3.0-alpha02

реализация 'androidx.appcompat: appcompat: 1.3.0-alpha02'

Вишал Павар
источник
1
Обновленная зависимость: - реализация 'androidx.appcompat: appcompat: 1.3.0-alpha02'
Амит Джаясвал
0

Думаю это ошибка в androidx. Я обнаружил, что ошибка вызывает задержку в отладочных сборках, но не показывает и не замедляет производственные сборки, поэтому я просто проигнорировал ее пока.

Боб Боббингтон
источник
Я уже использую AppCompatActivity :(. Но появляется ошибка.
Мохан Рекс
1
@MohanRex - именно такое сообщение появляется при использовании AppCompatActivity. Тем не менее следует использовать AppCompatActivity - просто игнорируйте это безобидное раздражение.
ToolmakerSteve
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. Я получаю эту ошибку, создав шаблон «Basic Activity» с использованием compileSdkVersion 28, buildToolsVersion 29.0.3, minSdkVersion 16, targetSdkVersion 28.
kbro
-2

Ответы выше верны. Единственный способ избежать этого - удалить ссылки на AppCompat - например, я перешел на FragmentActivity. Плохая новость заключается в том, что все новые библиотеки материалов ссылаются на проблему и испытывают ее. Я не хотел, чтобы это происходило в моем стартапе - в дальнейшем хит не так уж и плох. Это всего лишь предупреждение, но оно оказывает влияние на производительность, и это довольно фальшиво и плохо обрабатывается большим G.

Дэниел Хейвуд
источник
1
Re "Я перешел на FragmentActivity" . Плохая идея - это означает, что ваше приложение не будет работать на старых устройствах. Оставайтесь с AppCompat. Re: «Это всего лишь предупреждение, но оно влияет на производительность» - чтобы уточнить, любое влияние на производительность незначительно при сборке релиза; в основном это раздражает, добавляя беспорядок в начале журнала отладки.
ToolmakerSteve
-3

Аннотация на @RequiresApi(28)самом деле означает, что единственная build.gradleконфигурация, которая может избавиться от спама в журналах, - это поднять minSdkVersionзначение как минимум до 28. Считайте это предупреждением, которое нельзя отключить, а не ошибкой.

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

Голосование против только доказывает, насколько антиинтеллектуален этот сайт ...

Мартин Цайтлер
источник
не очень удобен ... в наши дни нельзя ожидать, что у пользователей будет только 28+.
zeroDivider
ну, это всего лишь предупреждение, даже если спам в журнале раздражает ... тем не менее, можно даже добавить шаблон исключения регулярного выражения в logcat и просто отфильтровать это сообщение журнала.
Мартин
minSdkВерсия 28 определенно слишком высока для большинства приложений
Ву Юань Чун
@WuYuanChun, это был не вопрос - и это единственный ответ, который фактически скрывает проблему.
Мартин
Чтобы уточнить: изменение minSDK на 28 приводит к тому, что приложение не будет работать на старых устройствах. Правильно? Если да, то это должно быть в ответе как заметное предупреждение.
ToolmakerSteve
-5

Вы можете избежать этого, потому что этот конкретный класс только в Android 9.

Джонатан
источник
1
Не могли бы вы дать более подробную информацию. Будет очень полезно.
Мохан Рекс
3
См. Developer.android.com/reference/android/view/… . Похоже, это ошибка, из-за которой android.support.v4.view.ViewCompat не реализует ожидаемый интерфейс.
AL Flanagan
4
(Выше класс ==> androidx.core.view.ViewCompat) Есть отчет об ошибке Issueetracker.google.com/issues/110162198, который помечен как «невозможно дублировать». Возможно, вы захотите заполнить отчет об ошибке со всей информацией, необходимой для воспроизведения проблемы.
AL Flanagan
Спасибо за ссылку, я расширил проблему в трекере своим кодом в надежде, что они смогут ее воспроизвести.
findusl 09