【问题标题】:appcompat-v7 v21.0.0 causing crash on Samsung devices with Android v4.2.2appcompat-v7 v21.0.0 导致使用 Android v4.2.2 的三星设备崩溃
【发布时间】:2014-12-26 18:01:23
【问题描述】:

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

【问题讨论】:

  • 这可能是一个相关的问题,但它似乎是一个略有不同的例外。另一个问题中最近发布的一个解决方案与在操作栏中有一个微调器有关,而我没有这种情况。我只是在使用菜单项。
  • 我也有这个问题。应用程序正在生产中并收到来自三星的 4.2.2 崩溃。设备
  • 我的操作栏中也没有微调器,我是从运行 Android 4.2.2 的非三星设备获得的:Qmobile I9 和 Wiko(未知型号)。
  • @Devashish:第二个答案中的 proguard 解决方案对我有用。我针对受 appthwack.com 影响的三星设备进行了测试,在应用 proguard 配置后,我不再出现错误。

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


【解决方案1】:

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

通过使用

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

而不是

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

【讨论】:

  • 我认为你可以通过使用“-keepnames”而不是“-keep”来节省更多空间。
  • 正如code.google.com/p/android/issues/detail?id=78377 的讨论中所述,使用此特定解决方案可能会由于 appcompat 库中的资源引用而导致问题。但是,这一直适用于我们的特定应用,因此我将此答案标记为已接受。
  • 我应该在哪里写这行?
  • @BugsHappen,这将进入您的 Gradle 构建文件。您可以在此处阅读有关 ProGuard 的更多信息:developer.android.com/tools/help/proguard.html
【解决方案2】:

正如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
  • 想通了;看我的回答。
  • 嘿,安迪,我有同样的问题,MenuBuilder 没有被混淆,但其他人是,介意告诉我你是如何解决的吗?谢谢
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

          默认设置为“Lollipop”

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

          步骤

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

          【讨论】:

            【解决方案8】:

            替换 AppCompatActivity 有活动

            这对我有帮助。

            【讨论】:

            • 廉价修复。他可能正在使用 AppCompat,因为他想支持 API
            • 我认为,如果有人同意 Sufian 命名的原因,那么被否决的帖子可能已经够糟糕了。但被删除也不错。
            【解决方案9】:

            替换

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

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

            这对我有帮助。

            【讨论】:

            • 请停止在同一问题上重复您的答案。
            猜你喜欢
            • 2014-12-30
            • 1970-01-01
            • 1970-01-01
            • 2023-04-11
            • 1970-01-01
            • 2015-04-05
            • 2016-05-14
            • 2021-05-14
            • 1970-01-01
            相关资源
            最近更新 更多