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

Во вновь созданном проекте с 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)

У меня такая же ошибка. Вы нашли обходные пути?

c0nst 13.09.2018 10:51

Нет, я не нашел обходного пути.

Mohan Rex 25.09.2018 12:43

Я получаю аналогичную ошибку Rejecting re-init on previously-failed class java.lang.Class<android.support.v4.view.ViewCompat$OnUnhandl‌​edKeyEventListenerWr‌​apper>: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/view/View$OnUnhandledKeyEventListener;, но не AndroidX. Это другая причина?

Dale 19.04.2019 02:53

@Mohan Rex Помогите мне, пожалуйста, как решить эту проблему?

Garg's 19.08.2019 10:29

Единственное, что мне помогло, - это заменить extends AppCompatActivity только Activity во всех моих действиях. Например. открытый класс MainActivity расширяет Activity. У меня больше ничего не работало. После этого предупреждение исчезнет, ​​так как оно связано с AppCompat в android X. Однако это не лучшее решение для обратной совместимости.

Darksymphony 20.11.2019 13:09

У меня аналогичная ошибка, и приложение не отображает пользовательский интерфейс после обновления Android Studio Canary. Я решил это с помощью: запустить приложение (или сначала попробовать другое приложение) на другом телефоне работает, затем вернуться к предыдущему телефону (удаленное приложение вручную, не уверен, что это настоящее решение или нет) снова работает.

Fruit 25.03.2020 08:32

Перейти, чтобы увидеть, как у меня работает ответ: stackoverflow.com/a/62991930/3260008

Amos 09.12.2020 14:16
112
7
39 411
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

Не могли бы вы дать более подробную информацию. Это будет очень полезно.

Mohan Rex 19.08.2018 16:22

См. developer.android.com/reference/android/view/…. Похоже, это ошибка, из-за которой android.support.v4.view.ViewCompat не реализует ожидаемый интерфейс.

A. L. Flanagan 18.09.2018 18:32

(Выше класс ==> androidx.core.view.ViewCompat) Есть отчет об ошибке issueetracker.google.com/issues/110162198, который помечен как «невозможно дублировать». Возможно, вы захотите заполнить отчет об ошибке со всей информацией, необходимой для воспроизведения проблемы.

A. L. Flanagan 18.09.2018 18:38

Спасибо за ссылку, я расширил проблему в трекере своим кодом в надежде, что они смогут ее воспроизвести.

findusl 09.11.2018 23:54

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

Уже пользуюсь AppCompatActivity :(. Но ошибка появляется.

Mohan Rex 08.09.2018 17:48

@MohanRex - именно такое сообщение появляется при использовании AppCompatActivity. Тем не менее, один должен использует AppCompatActivity - просто игнорируйте это безобидное раздражение.

ToolmakerSteve 18.03.2020 23:28
Ответ принят как подходящий

Как упомянул А.Л. Фланаган в комментарии, проблема в том, что 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);
    }
}

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

Проблема была помечена как не исправлю, и никто не позаботился дать объяснение или обходной путь.

Odys 17.12.2018 17:24

Кажется, ошибка была повторно отправлена ​​сюда Issuesetracker.google.com/issues/120750246

aaronmarino 19.12.2018 12:30

Ну, мое приложение просто вообще не работает, и я просто вижу эту ошибку при отладке (Logcat). Приложение не аварийно завершает работу, но «contentView» также не обновляется, оставляя пустой экран.

Iúri dos Anjos 22.01.2019 21:35

@AlvaroSantisteban Как использовать этот класс и где его вызывать?

Sulabh Gajjar 31.01.2019 12:30

У меня такая же проблема ... Не происходит сбоев, но у view есть неожиданное поведение. Это начало происходить, как только я обновил компиляцию sdk до 28 с 27.

Amit Kumar 01.03.2019 19:14

@AmitKumar, а что если обновиться до 29? В моем случае на эмуляторе API 27 я получаю предупреждение «Отклонение повторной инициализации для ранее неудачного класса java.lang.Class <androidx.core.view.ViewCompat $ OnUnhandledKey‌ EventListenerWrapper‌>: java.lang.NoClassDefFoundError: Неудачное разрешение: Landroid / view / View $ OnUnhandledKeyEventListener; ".

CoolMind 12.07.2019 10:54

Мое приложение вылетает с этой ошибкой, только в мобильном мото G6, api 28. Я не могу найти какие-либо ресурсы по этому поводу, как исправить сбой, если @Odys сообщает, что он не будет исправлен на основе системы отслеживания проблем?

Aalap Patel 13.09.2019 19:25

Есть ли у нас какое-нибудь решение этой проблемы?

Yerram Naveen 24.09.2019 09:26

Это сбой во время выполнения на каждом устройстве с API <26

John Sardinha 02.11.2019 13:20

@AalapPatel. Если ваше приложение дает сбой, есть другая причина - это сообщение само по себе не вызывает сбоя, AFAIK. Это можно проверить, запустив отладочную сборку любого работающего приложения на том же устройстве или эмуляторе - сообщение все еще появляется, но приложение не аварийно завершает работу? Об этом сообщает большинство людей; само сообщение безвредно (при условии, что вы обновили до последней версии инструментов - комментарий к отчету о проблеме предполагает, что это могло быть сбоем до февраля 2019 года) ...

ToolmakerSteve 18.03.2020 23:31

Проблема решена в androidx.appcompat: appcompat: 1.3.0-beta01

Mubarak 25.02.2021 07:19

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

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

ToolmakerSteve 18.03.2020 23:23

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

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

Из баг-трекера:

This bug is closed as Won't Fix (Intended Behavior), these errors can be ignored.

не очень удобен ... в наши дни нельзя ожидать, что у пользователей будет только 28+.

zeroDivider 20.08.2019 00:17

ну, это всего лишь предупреждение, даже если журнал-спам раздражает ... тем не менее, можно даже добавить шаблон исключения регулярного выражения в logcat и просто отфильтровать это сообщение журнала.

Martin Zeitler 20.08.2019 00:20

minSdkVersion 28 определенно слишком высок для большинства приложений

Wu Yuan Chun 08.11.2019 10:20

Чтобы уточнить: изменение minSDK на 28 приводит к тому, что приложение не будет работать на старых устройствах. Правильно? Если да, то это должно быть в ответе как заметное предупреждение.

ToolmakerSteve 18.03.2020 23:21

@ToolmakerSteve Не осознавая этого, у одного, вероятно, есть некоторый дефицит ... и можно проголосовать за меня сколько угодно; Я не буду удалять этот правильный ответ - нравится ему это или нет.

Martin Zeitler 09.10.2020 22:16

Я не голосовал против вас. (Я согласен с тем, что ваш ответ решает проблему.) Я просто указал, что в вашем ответе есть очень важный побочный эффект, что вы должны четко предупреждать людей о в своем ответе: это приводит к тому, что приложение не может быть загружено / запущено в более старых версиях.

ToolmakerSteve 13.10.2020 02:46

Подумайте об этом дальше: ответ может быть «правильным», но при этом содержать «плохой совет». Большинство людей, читающих этот Q&A не должна, делают то, что вы показываете. Я так понимаю, вы показали, что было бы подавляет предупреждение, а не рекомендую, что кто-то установил min sdk. Но имейте в виду, что некоторые читатели могут быть ошеломлены деталями на раннем этапе обучения. Голосование против может означать, что члены сообщества думают, что «это плохой совет». Способ решить эту проблему - уточнить ваши намерения и последствия фрагмента кода.

ToolmakerSteve 13.10.2020 03:44

@ToolmakerSteve Это просто печальная реальность, что большинство людей здесь просто копируют, вставляют и голосуют за самый простой обходной путь (вместо решения), не понимая, что они скопировали, - а затем задаются вопросом, когда они сталкиваются с дальнейшими проблемами дорога. И я объяснил, почему это происходит и что с этим делать - или просто игнорировать это (то, что это не может быть решено, не кажется приемлемым ответом). Вопрос не в обратной совместимости. 91 голос за без подхода наименьшего решения ...

Martin Zeitler 13.10.2020 05:52

вы можете использовать аспект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 15.05.2020 18:56

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

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

Обновленная зависимость: - реализация 'androidx.appcompat: appcompat: 1.3.0-alpha02'

Amit Jayaswal 25.08.2020 11:58

У меня работало, у меня была аналогичная ошибка с уровнем API 26.

Luciano Brum 27.11.2020 22:56

Это НАСТОЯЩЕЕ исправление, спаси меня, спасибо!

Amos 09.12.2020 14:16

Идеальный

Yogesh Nikam Patil 14.06.2021 19:31

Другие вопросы по теме