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方面解决它的方法是重命名这些内部类。
此问题返回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块中设置minifyEnabled为true 即可 。 喜欢这个:
buildTypes { debug { minifyEnabled true } release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }
我在debuggingtypes中将minifyEnabled设置为true,以防止应用程序通过USBdebugging崩溃到现场手机。
我启用了与eclipse项目提供的默认proguard属性的proguard和问题已经修复了我。 根据https://code.google.com/p/android/issues/detail?id=78377上的一些评论,有些人可能需要使用以下内容重新打包:-repackageclasses“android.support.v7”;
尝试通过Android Studio在我的Samsung Galaxy Tab 3平板电脑上运行“Hello World”应用程序时出现同样的错误。 该应用程序似乎会启动,然后它会立即崩溃,该错误将显示在Android Studio中的控制台。 我在平板电脑上做了一个系统更新,现在我可以运行“Hello World”应用程序,而且我不会再出现这个错误了。 我希望这可以帮助别人解决他们的问题。
注意:我在平板电脑上执行的系统更新没有更新Android操作系统版本,因为它仍然表示版本是4.2.2。
将项目的编译Sdk版本更改为“API 18:(JellyBean)”
默认设置为“棒棒糖
脚步
- 右键单击您的项目,然后select打开模块设置(或按F4)
- 在属性选项卡编译的Sdk版本