サポートアクションバーを利用してマテリアルテーマをサポートするために、アプリケーションをappcompat-v7 support
ライブラリを使用するように変更しました。 v21.0.0 of appcompat-v7
(およびv21.0.0 of support-v4)
を使用すると、Google Play
およびCrashlyticsでSamsungデバイスからのみクラッシュが発生していますrunning
Android v4.2.2. Here is the stack trace from Google Play and the app appears to crash as soon as the
actionbar`が表示または無効化されます。
Java.lang.NoClassDefFoundError: Android.support.v7.internal.view.menu.MenuBuilder
at Android.support.v7.app.ActionBarActivityDelegateBase.initializePanelMenu(ActionBarActivityDelegateBase.Java:991)
at Android.support.v7.app.ActionBarActivityDelegateBase.preparePanel(ActionBarActivityDelegateBase.Java:1041)
at Android.support.v7.app.ActionBarActivityDelegateBase.doInvalidatePanelMenu(ActionBarActivityDelegateBase.Java:1259)
at Android.support.v7.app.ActionBarActivityDelegateBase.access$100(ActionBarActivityDelegateBase.Java:80)
at Android.support.v7.app.ActionBarActivityDelegateBase$1.run(ActionBarActivityDelegateBase.Java:116)
at Android.os.Handler.handleCallback(Handler.Java:725)
at Android.os.Handler.dispatchMessage(Handler.Java:92)
at Android.os.Looper.loop(Looper.Java:176)
at Android.app.ActivityThread.main(ActivityThread.Java:5299)
at Java.lang.reflect.Method.invokeNative(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:511)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1102)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:869)
at dalvik.system.NativeStart.main(Native Method)
V4.2.2を実行している他のデバイスおよびエミュレーターでは、この動作は見られません。多くのGoogleアプリは、この新しいバージョンのappcompat
を使用してアクションバーを表示していることを理解しています。これらのアプリがこれらのデバイスでクラッシュを報告していない場合、これがどのように回避/修正されているかを知ることが役立つでしょう。
これをバグとしてGoogleに報告しましたが、開発上の問題であるという理由でクローズされました。私はこれが事実かもしれないことに同意しますが、誰が現在appcompat-v7 v21.0.0
を使用でき、Samsung 4.2.2 devices
でクラッシュしないのか/どのように疑問に思っています。
更新:Googleは少なくともこの問題の可能な回避策を検討しているようです。詳細については、 this を参照してください。
ここで適切なソリューションを見つけました: https://stackoverflow.com/a/26641388/126612
を使用して
-keep class !Android.support.v7.internal.view.menu.**,Android.support.v7.** {*;}
の代わりに
-keep class Android.support.v7.** {*;}
https://code.google.com/p/Android/issues/detail?id=78377 の#150として
-keep class!Android.support.v7.internal.view.menu。**に注意してください。 appcompatのリソースから参照される多くのクラスがあります。
より良い解決策は、代わりに次の行を追加することです。
-keep class !Android.support.v7.internal.view.menu.MenuBuilder, !Android.support.v7.internal.view.menu.SubMenuBuilder, Android.support.v7.** { *; }
-keep interface Android.support.v7.** { *; }
Appcompat 23.1.1
the .internal
AppCompat jarのパッケージが削除されました。
Proguardを使用して更新された修正:
#FOR APPCOMPAT 23.1.1:
-keep class !Android.support.v7.view.menu.*MenuBuilder*, Android.support.v7.** { *; }
-keep interface Android.support.v7.* { *; }
この問題を抱えているすべての人にとって、これまでのところ回避策のみがproguardを使用しているようです。 https://code.google.com/p/Android/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars&groupby=&sort=&idのチェックアウトディスカッション= 78377
誰もprogaurdなしでソリューションを使用することに興味がある場合。
リンク を読んでください。onCreate()のsetSupportActionBar(toolbar)で例外が発生したアプリの1つでこれを試しました。
呼び出しの周りにtry catchブロックを追加するだけです
try {
setSupportActionBar(toolbar);
} catch (Throwable t) {
// WTF SAMSUNG!
}
Tecno P9でも同じ問題が発生しましたが、ビルドツール24を使用した後、サポートライブラリでは24.2.0を使用し、修正されました。