appcompat-v7 v21.0.0导致与Android v4.2.2的三星设备崩溃

我们只是将应用程序更改为使用appcompat-v7 support库,以利用支持操作栏并支持Material主题。 使用v21.0.0 of appcompat-v7 (和v21.0.0 of support-v4) ,我们现在只能在running Android v4.2.2的三星设备running看到Google Play和Crashlytics中的崩溃. Here is the stack trace from Google Play and the app appears to crash as soon as the . Here is the stack trace from Google Play and the app appears to crash as soon as the栏显示和/或失效. Here is the stack trace from Google Play and the app appears to crash as soon as the

 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的其他设备和仿真程序不会显示此行为。 这是我的理解,许多谷歌应用程序已经使用这个新版本的appcompat来显示操作栏。 如果这些应用程序不报告这些设备上的崩溃,那么知道如何避免/修复这将是有帮助的。

我将这个报告称为Google的一个漏洞,但是由于这是一个开发问题,所以它已经closures了。 虽然我同意这可能是这种情况,我想知道是否/目前如何能够使用appcompat-v7 v21.0.0而不是在Samsung 4.2.2 devices上崩溃。

更新:看起来谷歌至less考虑可能的解决方法。 详情请参阅此 。

我在这里find了适当的解决scheme: https : //stackoverflow.com/a/26641388/1266123

通过使用

 -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类!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 AppCompat jar中的.internal包已被删除。

使用proguard更新修复程序:

 #FOR APPCOMPAT 23.1.1: -keep class !android.support.v7.view.menu.*MenuBuilder*, android.support.v7.** { *; } -keep interface android.support.v7.* { *; } 

如果有人在使用没有progaurd的解决scheme感兴趣。

阅读链接我已经在我的应用程序中的一个onCreate()setSupportActionBar(工具栏)例外的尝试。

它非常简单,只是在呼叫中添加try catch块

 try { setSupportActionBar(toolbar); } catch (Throwable t) { // WTF SAMSUNG! } 

我在Tecno P9上遇到了同样的问题,但在使用构build工具24和我的支持库之后,我使用了24.2.0,它被修复了。

将项目的编译Sdk版本更改为“API 18:(JellyBean)”

默认设置为“棒棒糖”

到目前为止,它解决了我在Qmobile i9上的问题

脚步

  1. 右键单击您的项目并select打开模块设置(或按F4)
  2. 在属性选项卡编译的Sdk版本

将AppCompatActivityreplace为活动

这帮助了我。

更换

 public class class_name extends AppCompatActivity { ......... } 

 public class class_name extends Activity { ......... } 

这帮助了我。