NoClassDefFoundError:android.support.v7.internal.view.menu.MenuBuilder

运行Android 4.2的三星设备上的Android appcompat v7库存在问题。 在开发者控制台中,我一直在使用以下堆栈跟踪导致崩溃:

java.lang.NoClassDefFoundError: android.support.v7.internal.view.menu.MenuBuilder at android.support.v7.widget.PopupMenu.<init>(PopupMenu.java:66) at com.[my-package-name].CustomActivity$5.onClick(CustomActivity.java:215) at android.view.View.performClick(View.java:4222) at android.view.View$PerformClick.run(View.java:17620) at android.os.Handler.handleCallback(Handler.java:800) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loop(Looper.java:194) at android.app.ActivityThread.main(ActivityThread.java:5391) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:525) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) at dalvik.system.NativeStart.main(Native Method) 

这是CustomActivity.java的215行:

 PopupMenu popup = new PopupMenu(CustomActivity.this, mImageViewMenu); 

崩溃来自一系列设备,但总是三星,总是Android 4.2。

一个快速的networkingsearch引导我相信,许多人都有同样的问题,我试图解决这个问题的一些步骤是:

  • 检查Android项目属性,确保appcompat库已正确添加。
  • 检查Java构buildpath顺序和导出项目属性,确保Android依赖关系和Android专用库被选中。
  • 确认该类包含在库中(android.support.v7.internal.view.menu.MenuBuilder)。
  • 确认R.java位于android.support.v7.appcompat的gen目录下。
  • 确认Manifest.xml活动中包含AppCompat主题。
  • 清理和重build项目。

尽pipe采取了这些步骤,尽pipe它在所有其他设备和Android版本上运行,但崩溃报告仍然通过。

编辑:

为我工作的解决scheme是(使用Proguard)来取代这个:

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

有了这个:

 # Allow obfuscation of android.support.v7.internal.view.menu.** # to avoid problem on Samsung 4.2.2 devices with appcompat v21 # see https://code.google.com/p/android/issues/detail?id=78377 -keep class !android.support.v7.internal.view.menu.**,android.support.** {*;} 

信贷转到谷歌组,#138 。

旧答案(临时解决方法):它发生在我 ActionBar中使用微调器的项目中。 我的解决scheme是检查这些条件并更改应用程序stream程:

 public static boolean isSamsung_4_2_2() { String deviceMan = Build.MANUFACTURER; String deviceRel = Build.VERSION.RELEASE; return "samsung".equalsIgnoreCase(deviceMan) && deviceRel.startsWith("4.2.2"); } 

然后在活动的onCreate方法中:

 if (isSamsung_4_2_2()) { setContentView(R.layout.activity_main_no_toolbar); } else { setContentView(R.layout.activity_main); } 

正如指出的那样,这不是一个明确的解决scheme,它只是一种让用户能够访问有限的function而find更永久的解决scheme的方法。

谷歌集团的#150说

因为谨慎使用-keep类!android.support.v7.internal.view.menu。**。 那里有很多类是从appcompat的资源引用的。

更好的解决方法是添加以下行代替:

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

你在哪个设备上面对这个问题? (三星/ HTC等)

如果是三星,

各种三星手机都包含在框架或类path中的Android支持库的旧版本。 如果您使用新的材质支持库,则会在这些三星设备上看到此次崩溃:

 java.lang.NoClassDefFoundError: android.support.v7.internal.view.menu.MenuBuilder 

要解决这个问题,你必须重命名该类。 最简单的方法就是运行proguard。 如果你不想混淆,这里有一个class轮来重新命名违规类:

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

有一个跟踪这个问题的问题,但是因为它确实是一个三星的错误,所以它永远不会被修复。 只有在Google / AOSP方面解决它的方法是重命名这些内部类。

https://code.google.com/p/android/issues/detail?id=78377

此问题返回AppCompat 23.1.1从库jar中删除.internal包。

正如上面的评论中所build议的(给那些在那里提出build议的人提供信用),现在也需要改变proguardconfiguration。

为了得到上面build议的答案,请尝试将这些行添加到您的proguard文件中:

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

而不是旧的修复:

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

根据bug报告的最后一个post,这个问题应该在新版本的支持库(24.0.0)上得到解决: https : //code.google.com/p/android/issues/detail? id = 78377 #c374

有人甚至声称修理它。

这个版本从上个月开始可用,所以你应该更新它。

是。 三星已经知道这个问题。 我可以build议你尝试从GitHub使用相同的Popup实现。 这不是最好的方式,但将是作品。

我遇到了在USBdebugging模式下找不到这个MenuBuilder类的问题。 我解决了这个问题,只需在build.gradle的 release和debug buildTypes块中设置minifyEnabledtrue 即可 。 喜欢这个:

 buildTypes { debug { minifyEnabled true } release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } 

我在debuggingtypes中将minifyEnabled设置为true,以防止应用程序通过USBdebugging崩溃到现场手机。

尝试通过Android Studio在我的Samsung Galaxy Tab 3平板电脑上运行“Hello World”应用程序时出现同样的错误。 该应用程序似乎会启动,然后它会立即崩溃,该错误将显示在Android Studio中的控制台。 我在平板电脑上做了一个系统更新,现在我可以运行“Hello World”应用程序,而且我不会再出现这个错误了。 我希望这可以帮助别人解决他们的问题。

注意:我在平板电脑上执行的系统更新没有更新Android操作系统版本,因为它仍然表示版本是4.2.2。

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

默认设置为“棒棒糖

脚步

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