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


79

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

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至少正在考虑为此可能的解决方法。请参阅了解详情。



这可能是一个相关问题,但似乎是一个略有不同的例外。在另一个问题中发布的一个最新解决方案涉及在操作栏中设置微调器,我没有这种情况。我只是在使用菜单项。
Erik Pedersen 2014年

我也遇到了这个问题。应用程式正在生产中,并从4.2.2接收来自三星的当机。设备
Martin Vandzura 2014年

1
我的操作栏中也没有旋转器,并且正在运行Android 4.2.2的非三星设备上使用它:Qmobile I9和Wiko(未知型号)。
尔根'Kashban'Wahlmann 2014年

1
@Devashish:第二个答案中的proguard解决方案对我有用。我针对受appthwack.com影响的三星设备进行了测试,在应用了proguard配置后,我再也没有出现错误。
的Jürgen 'Kashban' Wahlmann

Answers:


15

我在这里找到了正确的解决方案:https : //stackoverflow.com/a/26641388/1266123

通过使用

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

代替

-keep class android.support.v7.** {*;}

1
我认为您可以使用“ -keepnames”而不是“ -keep”来节省更多空间。
贾斯汀

code.google.com/p/android/issues/detail?id=78377中的讨论所述,使用此特定解决方案可能会由于appcompat库中的资源引用而导致问题。但是,这对于我们的特定应用程序一直有效,因此我将此答案标记为已接受。
Erik Pedersen 2015年

我应该在哪里写这行?
错误发生

@BugsHappen,这将放在您的Gradle构建文件中。您可以在此处阅读有关ProGuard的更多信息:developer.android.com/tools/help/proguard.html
Dick Lucas

7

正如来自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.** { *; }

在我的测试中,基于对生成的proguard映射文件的检查,此建议的proguard配置不会混淆MenuBuilder类的名称,尽管它确实混淆了SubMenuBuilder
Andy Dennie

弄清楚了; 看我的答案。
安迪·丹妮

嘿,安迪,我有同样的问题,MenuBuilder不会被混淆,但是其他人会被混淆,请告诉我您是如何解决的?谢谢
Qing Qing

6

由于删除了AppCompat jar中Appcompat 23.1.1.internal软件包。

使用proguard更新了修复程序:

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


1

如果有人有兴趣使用没有progaurd的解决方案。

阅读我在我的一个应用程序中尝试过的链接,链接在onCreate()中的setSupportActionBar(toolbar)上给出了异常。

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

try {

 setSupportActionBar(toolbar);

} catch (Throwable t) {

 // WTF SAMSUNG!

}

0

我在Tecno P9上遇到了相同的问题,但是在使用了构建工具24之后,对于我的支持库,我使用了24.2.0,该问题已得到修复。


-2

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

默认设置为“棒棒糖”

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

脚步

  1. 右键单击您的项目,然后选择“打开模块设置”(或按F4键)
  2. 在属性选项卡中,“已编译的SDK版本”

-3

用活动替换AppCompatActivity

这对我有帮助。


便宜的修复。他可能正在使用AppCompat,因为他想支持API <11之类的东西。这将打破那个想法。
Sufian

我认为,如果有人同意苏菲安提出的理由,那么该职位可能真够糟糕以至于无法接受。但是还不错,可以将其删除。
Gangnus

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.