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

我们刚刚更改了我们的应用程序,使用 appcompat-v7 support库,以便利用支持操作栏和支持材料主题。使用 v21.0.0 of appcompat-v7(和 v21.0.0 of support-v4),我们现在看到的崩溃在 Google Play和 Crashlytics 只从三星设备 runningAndroid v4.2.2显示和/或无效。

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 报告了这个 bug,但是因为它是一个开发问题,所以它被关闭了。虽然我同意这可能是这种情况,我想知道是否/如何有人目前能够使用 appcompat-v7 v21.0.0,而不会得到在 Samsung 4.2.2 devices崩溃。

更新: 看起来谷歌至少在考虑可能的解决方案。详情请参阅 这个

14830 次浏览

对于所有有这个问题的人来说,到目前为止似乎只有解决方法是使用 proguard.Checkout 在 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的讨论

我在这里找到了正确的解决方案: 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英镑所言

因为上课要小心 ! android.Support.v7.interal.view.menu. * * 从应用程序的资源中引用的类。

更好的解决方案是添加以下代码行:

-keep class !android.support.v7.internal.view.menu.MenuBuilder, !android.support.v7.internal.view.menu.SubMenuBuilder, android.support.v7.** { *; }
-keep interface android.support.v7.** { *; }

如果任何人有兴趣使用一个解决方案没有先进。

阅读 链接我曾经在我的一个应用程序中尝试过这种方法,它在 onCreate ()中给出了 setSupportActionBar (toolbar)异常。

它非常简单,只需在调用周围添加 try catch 块

try {


setSupportActionBar(toolbar);


} catch (Throwable t) {


// WTF SAMSUNG!


}

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

默认设置为 “棒棒糖”

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

步骤

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

替换 AppCompatActivity 有活力

这对我有帮助。

替换

public class class_name extends AppCompatActivity
{


.........


}

public class class_name extends Activity
{


.........


}

这对我有帮助。

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

我在 TecnoP9上遇到了同样的问题,但是在使用构建工具24和我的支持库24.2.0之后,问题就解决了。