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)
A.L.Flanaganがコメントで述べたように、問題はAndroid.support.v4.view.ViewCompat
が新しいandroidxパッケージ構造にView.OnUnhandledKeyEventListener
を実装せず、サポートライブラリ構造(少なくともバージョン28.0.0)のAPI 28以降でのみ実装することです。したがって、警告は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);
}
}
私はこの警告を解決するための簡単な修正方法について考えることはできません。
上記の答えは正しいです。これを避ける唯一の方法は、AppCompatへの参照を削除することです。 FragmentActivityに変更しました。悪いニュースは、新しい資料ライブラリがすべて問題を参照し、経験していることです。私はこれが私のスタートアップで起こることを望まなかった - ヒットは後でそれほど悪くない。これは単なる警告です - しかしパフォーマンスへの影響はあります、そしてそれはかなりの偽物であり、ビッグGによる扱いが不十分です.
アノテーション@RequiresApi(28)
は実際には、log-spamを取り除くための唯一のbuild.gradle
設定がminSdkVersion
を少なくとも28
に上げることであることを意味します。ミュートできない警告と考えてください。エラーではありません。
Android {
defaultConfig {
targetSdkVersion 28
compileSdkVersion 28
minSdkVersion 28
}
}
これはandroidxのバグだと思います。私は、エラーがデバッグビルドで遅れを引き起こすことを発見しましたが、プロダクションビルドを表示または遅くしないので、今のところ無視しました。