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)

person Mohan Rex    schedule 10.08.2018    source источник
comment
У меня такая же ошибка. Вы нашли обходные пути?   -  person c0nst    schedule 13.09.2018
comment
Нет, я не нашел обходного пути.   -  person Mohan Rex    schedule 25.09.2018
comment
Я получаю аналогичную, но не 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;. Это другая причина?   -  person Dale    schedule 19.04.2019
comment
@Mohan Rex Пожалуйста, помогите мне, как решить эту проблему?   -  person Garg's    schedule 19.08.2019
comment
Единственное, что мне помогло, это заменить extends AppCompatActivity просто Activity во всех моих действиях. Например. открытый класс MainActivity расширяет Activity. Ничто другое не работало для меня. После этого предупреждение исчезло, поскольку оно связано с AppCompat в Android X. Однако это не лучшее решение для обратной совместимости.   -  person Darksymphony    schedule 20.11.2019
comment
У меня аналогичная ошибка, и приложение не отображает пользовательский интерфейс после обновления Android Studio Canary. Я решил это с помощью: запустить приложение (или сначала попробовать другое приложение) на другом телефоне работает, затем вернуться к предыдущему телефону (удалить приложение вручную, не уверен, что это реальное решение или нет) снова работает.   -  person Fruit    schedule 25.03.2020
comment
Перейти, чтобы увидеть, что ответ работает для меня: stackoverflow.com/a/62991930/3260008   -  person Amos    schedule 09.12.2020


Ответы (7)


Как отметил А.Л.Фланаган в комментарии, проблема заключается в том, что android.support.v4.view.ViewCompat не реализует View.OnUnhandledKeyEventListener в новой структуре пакета androidx, а реализует его только начиная с API 28 в структуре библиотеки поддержки (по крайней мере, в версии 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);
    }
}

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

person AlvaroSantisteban    schedule 23.10.2018
comment
Проблема была помечена как неустранимая, и никто не потрудился дать объяснение или обходной путь. - person Odys; 17.12.2018
comment
Похоже, ошибка была повторно отправлена ​​сюда issuetracker.google.com/issues/120750246. - person aaronmarino; 19.12.2018
comment
Ну, мое приложение вообще не работает, и я просто вижу эту ошибку в своей отладке (Logcat). Приложение не вылетает, но contentView также не обновляется, оставляя пустой экран. - person Iúri dos Anjos; 22.01.2019
comment
@AlvaroSantisteban Как использовать этот класс и где его вызывать? - person Sulabh Gajjar; 31.01.2019
comment
У меня такая же проблема. Это не сбой, но представление имеет неожиданное поведение. Это начало происходить, как только я обновил SDK компиляции до 28 с 27. - person Amit Kumar; 01.03.2019
comment
@AmitKumar, а что если обновиться до 29? В моем случае на эмуляторе API 27 я получаю предупреждение об отклонении повторной инициализации ранее неудачного класса java.lang.Class‹androidx.core.view.ViewCompat$OnUnhandledKeyEventListenerWrapper›: java.lang.NoClassDefFoundError: Failed Resolution of: Landroid/view/ View$OnUnhandledKeyEventListener;. - person CoolMind; 12.07.2019
comment
Мое приложение вылетает с этой ошибкой, только на мобильном телефоне moto G6, API 28. Я не могу найти какие-либо ресурсы по этому вопросу, как исправить сбой, если @Odys сообщает, что это не будет исправлено на основе системы отслеживания проблем? - person Aalap Patel; 13.09.2019
comment
Есть ли у нас решение этой проблемы? - person Yerram Naveen; 24.09.2019
comment
Это сбой во время выполнения на каждом устройстве с API ‹26. - person John Sardinha; 02.11.2019
comment
@АалапПател. Если ваше приложение дает сбой, есть какая-то другая причина - это сообщение само по себе не вызывает сбоя, насколько я знаю. Это можно проверить, запустив отладочную сборку любого работающего приложения на том же устройстве или в эмуляторе. Появляется ли сообщение, но приложение не аварийно завершает работу? Это то, о чем сообщает большинство людей; само сообщение безвредно (при условии, что вы обновили инструменты до последней версии - комментарий к отчету о проблеме предполагает, что это мог быть сбой до февраля 2019 года)... - person ToolmakerSteve; 19.03.2020
comment
Проблема устранена в androidx.appcompat:appcompat:1.3.0-beta01. - person Mubarak; 25.02.2021

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

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

person Vishal Pawar    schedule 20.07.2020
comment
Обновленная зависимость: - реализация «androidx.appcompat: appcompat: 1.3.0-alpha02» - person Amit Jayaswal; 25.08.2020
comment
У меня сработало, у меня была аналогичная ошибка с уровнем API 26. - person Luciano Brum; 28.11.2020
comment
Это НАСТОЯЩЕЕ исправление, спасите мой день, спасибо! - person Amos; 09.12.2020
comment
Идеальный - person Yogesh Nikam Patil; 14.06.2021

вы можете использовать аспект 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();
        }
    }
}
person 包奇锋    schedule 13.03.2020
comment
Не могли бы вы объяснить, как заставить AspectJ работать с Android Studio 3.6.3. Я получаю эту ошибку после создания шаблона Basic Activity с использованием compileSdkVersion 28, buildToolsVersion 29.0.3, minSdkVersion 16, targetSdkVersion 28. - person kbro; 15.05.2020

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

person Bob bobbington    schedule 02.09.2018
comment
Я уже использую AppCompatActivity :( . Но появляется ошибка. - person Mohan Rex; 08.09.2018
comment
@MohanRex — именно это сообщение появляется при использовании AppCompatActivity. Тем не менее, следует использовать AppCompatActivity — просто игнорируйте это безобидное раздражение. - person ToolmakerSteve; 19.03.2020

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

person Daniel Haywood    schedule 13.05.2019
comment
Re Я перешел на FragmentActivity. Плохая идея — это означает, что ваше приложение не будет работать на старых устройствах. Оставайтесь с AppCompat. Re Это всего лишь предупреждение, но оно влияет на производительность. Чтобы уточнить, любое влияние на производительность в сборке релиза незначительно; в основном это раздражает, добавляя беспорядок в начале журнала отладки. - person ToolmakerSteve; 19.03.2020

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

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

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

Эта ошибка закрыта как не будет исправлена ​​(предполагаемое поведение), эти ошибки можно игнорировать.

person Martin Zeitler    schedule 24.05.2019
comment
не так удобно .. вы не можете ожидать, что в наши дни у пользователей будет только 28+. - person zeroDivider; 20.08.2019
comment
ну, это всего лишь предупреждение, даже если спам в журнале раздражает ... тем не менее, может быть даже возможно добавить шаблон исключения регулярных выражений в logcat и просто отфильтровать это сообщение журнала. - person Martin Zeitler; 20.08.2019
comment
minSdkVersion 28 определенно слишком высок для большинства приложений. - person Wu Yuan Chun; 08.11.2019
comment
Чтобы уточнить: изменение minSDK на 28 приводит к тому, что приложение не будет работать на старых устройствах. Верно? Если это так, это должно быть в ответе как заметное предупреждение. - person ToolmakerSteve; 19.03.2020
comment
@ToolmakerSteve Не понимая этого, у кого-то, вероятно, есть некоторый дефицит ... и можно сколько угодно голосовать за меня; Я не буду удалять этот правильный ответ - нравится он или нет. - person Martin Zeitler; 09.10.2020
comment
Я не минусовал тебя. (Я согласен, что ваш ответ действительно решает проблему.) Я просто указал, что ваш ответ имеет очень важный побочный эффект, о котором вы должны четко предупредить людей в своем ответ: это приводит к тому, что приложение нельзя загрузить/запустить в более старых версиях. - person ToolmakerSteve; 13.10.2020
comment
Если подумать об этом дальше: ответ может быть «правильным», но содержать «плохой совет». Большинство людей, читающих эти вопросы и ответы, не должны делать то, что вы показываете. Я понимаю, что вы показали, что будет подавлять предупреждение, а не рекомендовать, чтобы кто-то установил min sdk. Но имейте в виду, что некоторые читатели могут слишком рано учиться и быть перегружены деталями. Голоса против могут означать, что члены сообщества думают, что «это плохой совет». Способ решить эту проблему — прояснить свои намерения и последствия фрагмента кода. - person ToolmakerSteve; 13.10.2020
comment
@ToolmakerSteve Это просто печальная реальность, что большинство людей здесь просто копируют, вставляют и голосуют за самый простой обходной путь (вместо решения), не понимая, что они скопировали, а затем удивляются, когда они сталкиваются с дальнейшими проблемами вниз дорога. И я объяснил, почему это происходит и что с этим делать - или просто игнорировать это (то, что это невозможно решить, кажется неприемлемым ответом). Об обратной совместимости не могло быть и речи. 91 голос без наименьшего подхода к решению ... - person Martin Zeitler; 13.10.2020

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

person Jonathan    schedule 15.08.2018
comment
Не могли бы вы дать больше информации. Это будет очень полезно. - person Mohan Rex; 19.08.2018
comment
См. developer.android.com/reference/android/view/. Похоже, это ошибка, из-за которой android.support.v4.view.ViewCompat не реализует ожидаемый интерфейс. - person A. L. Flanagan; 18.09.2018
comment
(Класс выше ==› androidx.core.view.ViewCompat) Есть отчет об ошибке issuetracker.google.com /issues/110162198, который помечен как невозможный для копирования. Возможно, вы захотите отправить отчет об ошибке со всей информацией, необходимой для воспроизведения проблемы. - person A. L. Flanagan; 18.09.2018
comment
Спасибо за ссылку, я расширил проблему в трекере с моим кодом в надежде, что они смогут ее воспроизвести. - person findusl; 10.11.2018