Android 4.2を実行しているSamsungデバイスのAndroid appcompat v7ライブラリに問題があります。開発者コンソールの次のスタックトレースでクラッシュが発生し続けます。
Java.lang.NoClassDefFoundError: Android.support.v7.internal.view.menu.MenuBuilder
at Android.support.v7.widget.PopupMenu.<init>(PopupMenu.Java:66)
at com.[my-package-name].CustomActivity$5.onClick(CustomActivity.Java:215)
at Android.view.View.performClick(View.Java:4222)
at Android.view.View$PerformClick.run(View.Java:17620)
at Android.os.Handler.handleCallback(Handler.Java:800)
at Android.os.Handler.dispatchMessage(Handler.Java:100)
at Android.os.Looper.loop(Looper.Java:194)
at Android.app.ActivityThread.main(ActivityThread.Java:5391)
at Java.lang.reflect.Method.invokeNative(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:525)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:833)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:600)
at dalvik.system.NativeStart.main(Native Method)
これは、CustomActivity.Javaの215行目です。
PopupMenu popup = new PopupMenu(CustomActivity.this, mImageViewMenu);
クラッシュはさまざまなデバイスから発生しますが、常にSamsungであり、常にAndroid 4.2です。
簡単なWeb検索では、多くの人が同じ問題を抱えていると思い込んでいます。
これらの手順にも関わらず、他のすべてのデバイスとAndroidバージョンで動作しているにもかかわらず、クラッシュレポートは引き続き送信されます。
編集:
私のために働いた解決策は、これを置き換えることでした(Proguardを使用):
-keep class Android.support.v4.** { *; }
-keep interface Android.support.v4.** { *; }
-keep class Android.support.v7.** { *; }
-keep interface Android.support.v7.** { *; }
これとともに:
# Allow obfuscation of Android.support.v7.internal.view.menu.**
# to avoid problem on Samsung 4.2.2 devices with appcompat v21
# see https://code.google.com/p/Android/issues/detail?id=78377
-keep class !Android.support.v7.internal.view.menu.**,Android.support.** {*;}
クレジットは googleグループ、#138 に割り当てられます。
古い回答(一時的な回避策):私が使用するプロジェクトで発生します スピナー ActionBar。私の解決策は、これらの条件を確認し、アプリのフローを変更することでした:
public static boolean isSamsung_4_2_2() {
String deviceMan = Build.MANUFACTURER;
String deviceRel = Build.VERSION.RELEASE;
return "samsung".equalsIgnoreCase(deviceMan) && deviceRel.startsWith("4.2.2");
}
次に、アクティビティのonCreateメソッドで:
if (isSamsung_4_2_2()) {
setContentView(R.layout.activity_main_no_toolbar);
} else {
setContentView(R.layout.activity_main);
}
指摘したように、これは決定的なソリューションではなく、より永続的なソリューションが見つかったときにユーザーが制限された機能にアクセスできるようにするための単なる方法です。
Googleグループの#15 のように
-keep class!Android.support.v7.internal.view.menu。**に注意してください。 appcompatのリソースから参照される多くのクラスがあります。
より良い解決策は、代わりに次の行を追加することです。
-keep class !Android.support.v7.internal.view.menu.*MenuBuilder*, Android.support.v7.** { *; }
-keep interface Android.support.v7.** { *; }
どのデバイスでこの問題に直面していますか? (サムスン/ HTCなど)
サムスンの場合、
さまざまなサムスンの携帯電話には、フレームワークまたはクラスパスにAndroidサポートライブラリの古いバージョンが含まれています。新しいマテリアルサポートライブラリを使用すると、これらのSamsungデバイスでこのクラッシュが発生します。
Java.lang.NoClassDefFoundError: Android.support.v7.internal.view.menu.MenuBuilder
これを修正するには、そのクラスの名前を変更する必要があります。それを行う最も簡単な方法は、プロガードを実行することです。難読化したくない場合は、問題のあるクラスの名前を変更するための1つのライナーがあります。
-keep class !Android.support.v7.internal.view.menu.**,** {*;}
この問題を追跡する問題がありますが、それは本当にサムスンのバグなので、彼らの側で修正されることは決してありません。 Google/AOSP側で修正する唯一の方法は、これらの内部クラスの名前を変更することです。
この問題はAppCompat 23.1.1
で返され、.internal
パッケージはライブラリjarから削除されました。
上記のコメントで示唆されているように(そこで提案した人々の功績)、今ではプロガードの構成も変更する必要があります。
上記の提案された答えが再び機能するようにするには、これらの行をproguardファイルに追加してみてください。
#FOR APPCOMPAT 23.1.1:
-keep class !Android.support.v7.view.menu.*MenuBuilder*, Android.support.v7.** { *; }
-keep interface Android.support.v7.* { *; }
古い修正の代わりに:
#FOR OLDER APPCOMPAT VERSION:
-keep class !Android.support.v7.internal.view.menu.*MenuBuilder, Android.support.v7.** { ; }
-keep interface Android.support.v7.* { *; }
バグ報告の最後の投稿によると、これはサポートライブラリの新しいバージョン(24.0.0)で修正する必要があります。 https://code.google.com/p/Android/issues/detail ?id = 78377#c374
誰か 偶数クレーム それはそれを修正しました。
このバージョンは利用可能です 先月から ですので、更新する必要があります。
USBデバッグモードでは見つからない、このMenuBuilderクラスの同じ問題がありました。リリースとデバッグの両方でminifyEnabledをtrueに設定するだけでこの問題を解決しましたbuildTypes block of build.gradle 。このような:
buildTypes {
debug {
minifyEnabled true
}
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
}
}
debugタイプでminifyEnabledをtrueに設定して、ライブハンドセットへのUSBデバッグを介したアプリのクラッシュを防ぎます。
Eclipseプロジェクトで提供されているデフォルトのproguardプロパティでproguardを有効にし、問題は修正されました。ここのいくつかのコメントに基づいて https://code.google.com/p/Android/issues/detail?id=78377 、一部の人々は以下を使用して再パッケージ化する必要があります:-repackageclasses "Android.support.v7 」
Android Studioを介してSamsung Galaxy Tab 3タブレットで「Hello World」アプリを実行しようとすると、同じエラーが発生しました。アプリが起動したように見えるとすぐにクラッシュし、そのエラーがAndroid Studioのコンソールに表示されます。タブレットでシステムアップデートを行ったところ、「Hello World」アプリを実行できるようになりましたが、エラーはもう発生していません。これが誰かの問題解決に役立つことを願っています。
注:タブレットで実行したシステムアップデートでは、Android OSバージョンは更新されませんでした。バージョンがまだ4.2.2であると表示されているためです。