Во вновь созданном проекте с 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)
Нет, я не нашел обходного пути.
Я получаю аналогичную ошибку 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;, но не AndroidX. Это другая причина?
@Mohan Rex Помогите мне, пожалуйста, как решить эту проблему?
Единственное, что мне помогло, - это заменить extends AppCompatActivity только Activity во всех моих действиях. Например. открытый класс MainActivity расширяет Activity. У меня больше ничего не работало. После этого предупреждение исчезнет, так как оно связано с AppCompat в android X. Однако это не лучшее решение для обратной совместимости.
У меня аналогичная ошибка, и приложение не отображает пользовательский интерфейс после обновления Android Studio Canary. Я решил это с помощью: запустить приложение (или сначала попробовать другое приложение) на другом телефоне работает, затем вернуться к предыдущему телефону (удаленное приложение вручную, не уверен, что это настоящее решение или нет) снова работает.
Перейти, чтобы увидеть, как у меня работает ответ: stackoverflow.com/a/62991930/3260008
Вы можете избежать этого, потому что этот конкретный класс только в Android 9.
Не могли бы вы дать более подробную информацию. Это будет очень полезно.
См. developer.android.com/reference/android/view/…. Похоже, это ошибка, из-за которой android.support.v4.view.ViewCompat не реализует ожидаемый интерфейс.
(Выше класс ==> androidx.core.view.ViewCompat) Есть отчет об ошибке issueetracker.google.com/issues/110162198, который помечен как «невозможно дублировать». Возможно, вы захотите заполнить отчет об ошибке со всей информацией, необходимой для воспроизведения проблемы.
Спасибо за ссылку, я расширил проблему в трекере своим кодом в надежде, что они смогут ее воспроизвести.
Это ошибка в androidx. Я обнаружил, что ошибка вызывает задержку в отладочных сборках, но не показывает и не замедляет производственные сборки. Вы можете пока просто проигнорировать это.
Уже пользуюсь AppCompatActivity :(. Но ошибка появляется.
@MohanRex - именно такое сообщение появляется при использовании AppCompatActivity. Тем не менее, один должен использует AppCompatActivity - просто игнорируйте это безобидное раздражение.
Как упомянул А.Л. Фланаган в комментарии, проблема в том, что 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);
}
}
Я не могу придумать какое-либо простое решение для устранения этого предупреждения.
Проблема была помечена как не исправлю, и никто не позаботился дать объяснение или обходной путь.
Кажется, ошибка была повторно отправлена сюда Issuesetracker.google.com/issues/120750246
Ну, мое приложение просто вообще не работает, и я просто вижу эту ошибку при отладке (Logcat). Приложение не аварийно завершает работу, но «contentView» также не обновляется, оставляя пустой экран.
@AlvaroSantisteban Как использовать этот класс и где его вызывать?
У меня такая же проблема ... Не происходит сбоев, но у view есть неожиданное поведение. Это начало происходить, как только я обновил компиляцию sdk до 28 с 27.
@AmitKumar, а что если обновиться до 29? В моем случае на эмуляторе API 27 я получаю предупреждение «Отклонение повторной инициализации для ранее неудачного класса java.lang.Class <androidx.core.view.ViewCompat $ OnUnhandledKey EventListenerWrapper>: java.lang.NoClassDefFoundError: Неудачное разрешение: Landroid / view / View $ OnUnhandledKeyEventListener; ".
Мое приложение вылетает с этой ошибкой, только в мобильном мото G6, api 28. Я не могу найти какие-либо ресурсы по этому поводу, как исправить сбой, если @Odys сообщает, что он не будет исправлен на основе системы отслеживания проблем?
Есть ли у нас какое-нибудь решение этой проблемы?
Это сбой во время выполнения на каждом устройстве с API <26
@AalapPatel. Если ваше приложение дает сбой, есть другая причина - это сообщение само по себе не вызывает сбоя, AFAIK. Это можно проверить, запустив отладочную сборку любого работающего приложения на том же устройстве или эмуляторе - сообщение все еще появляется, но приложение не аварийно завершает работу? Об этом сообщает большинство людей; само сообщение безвредно (при условии, что вы обновили до последней версии инструментов - комментарий к отчету о проблеме предполагает, что это могло быть сбоем до февраля 2019 года) ...
Проблема решена в androidx.appcompat: appcompat: 1.3.0-beta01
Ответы выше верны. Единственный способ избежать этого - удалить ссылки на AppCompat - например, Я перешел на FragmentActivity. Плохая новость заключается в том, что все новые библиотеки материалов ссылаются на проблему и испытывают ее. Я не хотел, чтобы это происходило в моем стартапе - в дальнейшем хит не так уж и плох. Это всего лишь предупреждение, но оно влияет на производительность, и это довольно фиктивно и плохо обрабатывается большим G.
Re «Я перешел на FragmentActivity». Плохая идея - это означает, что ваше приложение не будет работать на старых устройствах. Оставайтесь с AppCompat. Re «Это всего лишь предупреждение, но оно влияет на производительность» - чтобы уточнить, какое-либо влияние на производительность при сборке релиза незначительно; в основном это раздражает, добавляя беспорядок в начале журнала отладки.
Аннотация @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+.
ну, это всего лишь предупреждение, даже если журнал-спам раздражает ... тем не менее, можно даже добавить шаблон исключения регулярного выражения в logcat и просто отфильтровать это сообщение журнала.
minSdkVersion 28 определенно слишком высок для большинства приложений
Чтобы уточнить: изменение minSDK на 28 приводит к тому, что приложение не будет работать на старых устройствах. Правильно? Если да, то это должно быть в ответе как заметное предупреждение.
@ToolmakerSteve Не осознавая этого, у одного, вероятно, есть некоторый дефицит ... и можно проголосовать за меня сколько угодно; Я не буду удалять этот правильный ответ - нравится ему это или нет.
Я не голосовал против вас. (Я согласен с тем, что ваш ответ решает проблему.) Я просто указал, что в вашем ответе есть очень важный побочный эффект, что вы должны четко предупреждать людей о в своем ответе: это приводит к тому, что приложение не может быть загружено / запущено в более старых версиях.
Подумайте об этом дальше: ответ может быть «правильным», но при этом содержать «плохой совет». Большинство людей, читающих этот Q&A не должна, делают то, что вы показываете. Я так понимаю, вы показали, что было бы подавляет предупреждение, а не рекомендую, что кто-то установил min sdk. Но имейте в виду, что некоторые читатели могут быть ошеломлены деталями на раннем этапе обучения. Голосование против может означать, что члены сообщества думают, что «это плохой совет». Способ решить эту проблему - уточнить ваши намерения и последствия фрагмента кода.
@ToolmakerSteve Это просто печальная реальность, что большинство людей здесь просто копируют, вставляют и голосуют за самый простой обходной путь (вместо решения), не понимая, что они скопировали, - а затем задаются вопросом, когда они сталкиваются с дальнейшими проблемами дорога. И я объяснил, почему это происходит и что с этим делать - или просто игнорировать это (то, что это не может быть решено, не кажется приемлемым ответом). Вопрос не в обратной совместимости. 91 голос за без подхода наименьшего решения ...
вы можете использовать аспект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.
У меня такая же проблема, но я просто попытался обновить зависимость для 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'
У меня работало, у меня была аналогичная ошибка с уровнем API 26.
Это НАСТОЯЩЕЕ исправление, спаси меня, спасибо!
Идеальный
У меня такая же ошибка. Вы нашли обходные пути?