web-dev-qa-db-ja.com

Android v4.2.2のSamsungデバイスでクラッシュを引き起こすappcompat-v7 v21.0.0

サポートアクションバーを利用してマテリアルテーマをサポートするために、アプリケーションをappcompat-v7 supportライブラリを使用するように変更しました。 v21.0.0 of appcompat-v7(およびv21.0.0 of support-v4)を使用すると、Google PlayおよびCrashlyticsでSamsungデバイスからのみクラッシュが発生していますrunningAndroid v4.2.2. Here is the stack trace from Google Play and the app appears to crash as soon as theactionbar`が表示または無効化されます。

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 を参照してください。

78
Erik Pedersen

ここで適切なソリューションを見つけました: https://stackoverflow.com/a/26641388/126612

を使用して

-keep class !Android.support.v7.internal.view.menu.**,Android.support.v7.** {*;}

の代わりに

-keep class Android.support.v7.** {*;}
15
robUx4

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.** { *; }
7
Pongpat

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.* { *; }
6
RWIL

この問題を抱えているすべての人にとって、これまでのところ回避策のみが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

2
vandzi

誰もprogaurdなしでソリューションを使用することに興味がある場合。

リンク を読んでください。onCreate()のsetSupportActionBar(toolbar)で例外が発生したアプリの1つでこれを試しました。

呼び出しの周りにtry catchブロックを追加するだけです

try {

 setSupportActionBar(toolbar);

} catch (Throwable t) {

 // WTF SAMSUNG!

}
1
Ravi

Tecno P9でも同じ問題が発生しましたが、ビルドツール24を使用した後、サポートライブラリでは24.2.0を使用し、修正されました。

0
Ikechukwu Kalu