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

时间:2014-10-30 15:40:09

标签: android proguard android-appcompat samsung-mobile android-4.2-jelly-bean

我们刚刚更改了我们的应用程序以使用appcompat-v7 support库,以便利用支持操作栏并支持Material主题。使用v21.0.0 of appcompat-v7(以及v21.0.0 of support-v4),我们现在看到Google Play中的崩溃和仅来自三星设备的{Crashlytics} 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

9 个答案:

答案 0 :(得分:15)

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

使用

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

而不是

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

答案 1 :(得分:7)

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

答案 2 :(得分:6)

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

答案 3 :(得分:2)

对于所有遇到此问题的人来说,到目前为止只有使用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

结帐讨论

答案 4 :(得分:1)

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

阅读link我在我的一个应用程序中试过这个,它在onCreate()的setSupportActionBar(工具栏)上给出了例外。

非常简单,只需在调用

周围添加try catch块
try {

 setSupportActionBar(toolbar);

} catch (Throwable t) {

 // WTF SAMSUNG!

}

答案 5 :(得分:0)

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

答案 6 :(得分:-2)

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

默认设置为“Lollipop”

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

STEPS

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

答案 7 :(得分:-2)

替换AppCompatActivity 随着活动

这帮助了我。

答案 8 :(得分:-2)

替换

public class class_name extends AppCompatActivity
{

.........

}

public class class_name extends Activity
{

.........

}

这帮助了我。