AndroidX: Appcompat I: помилка мистецтва 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

Я також додав config.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

Ні, я не знайшов жодного вирішення.
Мохан Рекс

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 Будь ласка, допоможіть мені, як виправити цю проблему?
Гарг

1
Єдине, що мені допомогло - це замінити розширення AppCompatActivity на просто активність у всіх моїх заходах. Наприклад, MainActivity розширює загальнодоступний клас. Більше нічого не працювало для мене. Після цього попередження відсутнє, оскільки воно пов’язане з AppCompat в android X. Однак, не найкраще рішення для зворотної сумісності
Darksymphony

Відповіді:


88

Як згадував у коментарі ALFlanagan, проблема полягає в тому, що 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);
    }
}

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


14
Проблема була позначена як не виправлена, і ніхто не піклувався дати пояснення чи вирішити.
Одіс

4
Схоже, помилка була надіслана сюди issueetracker.google.com/isissue/120750246
aaronmarino

2
Ну, моє додаток просто не працює, і я просто бачу цю помилку на моїй налагодці (Logcat). Додаток не виходить з ладу, але "contentView" також не оновлюється, залишаючи порожній екран.
Iúri dos Anjos

1
У мене виникають ті ж проблеми. Це не трапляється, але погляд має несподівану поведінку. Це почалося, як тільки я модернізував компіляційний sdk до 28 з 27.
Аміт Кумар

2
Це збій роботи на кожному пристрої з API <26
Джон


0

Я думаю, це помилка в androidx. Я виявив, що помилка викликає відставання в налагодженнях, але не показує і не сповільнює виробництво, тому я просто проігнорував це.


Я вже використовую AppCompatActivity :(. Але з’являється помилка.
Mohan Rex

1
@MohanRex - саме це повідомлення з’являється під час використання AppCompatActivity. Тим не менш, варто використовувати AppCompatActivity - просто ігноруйте цю нешкідливу роздратування.
ToolmakerSteve

0

ви можете використовувати aspektJ, щоб скасувати цю проблему, змінивши байтовий код 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

-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 і просто відфільтрувати це повідомлення журналу.
Мартін

minSdkVersion 28, безумовно, занадто високий для більшості
Ву Юань Чун

@WuYuanChun це не питання - і це єдина відповідь, яка насправді приховує проблему.
Мартін

Для уточнення: зміна minSDK на 28 призводить до програми, яка не працюватиме на старих пристроях. Правильно? Якщо так, то це повинно бути у відповіді як чітке попередження.
ToolmakerSteve

-5

Ви можете уникнути цього, оскільки цей специфічний клас лише в Android 9.


1
Підкажіть, будь ласка, більше інформації. Це буде дуже корисно.
Мохан Рекс

3
Див. Розробник.android.com/ reference/android/ view/… . Схоже, це помилка, де android.support.v4.view.ViewCompat не реалізує очікуваний інтерфейс.
AL Фланаган

4
(Вищий клас ==> androidx.core.view.ViewCompat) Існує звіт про помилку issueetracker.google.com/isissue/110162198, який позначений "неможливо дублювати". Ви можете розглянути можливість подання звіту про помилку з усією інформацією, необхідною для відтворення проблеми.
AL Фланаган

Щодо посилання, я поширив проблему в трекері зі своїм кодом, сподіваючись, що вони зможуть його відтворити.
findusl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.