猿问
下载APP

NoClassDefFoundError:android.support.v7.internal

运行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。


快速的网络搜索让我相信很多人都有同样的问题,我试图解决这个问题的一些步骤是:


检查Android项目属性,确保正确添加appcompat库。

检查Java Build Path Order和Export项目属性,确保选中Android Dependencies和Android Private Libraries。

确认该类包含在库中(android.support.v7.internal.view.menu.MenuBuilder)。

确认R.java位于android.support.v7.appcompat的gen目录中。

确认AppCompat主题包含在Manifest.xml活动中。

清理并重建项目。

尽管有这些步骤,尽管它在所有其他设备和Android版本上工作,但崩溃报告仍然存在。


回首忆惘然
浏览 63回答 3
3回答

四季花海

编辑:对我有用的解决方案是(使用Proguard)来替换它:-keep class android.support.v4.** { *; }&nbsp;-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中使用微调器的项目中。我的解决方案是检查这些条件并更改应用程序流程:public static boolean isSamsung_4_2_2() {&nbsp; &nbsp; String deviceMan = Build.MANUFACTURER;&nbsp; &nbsp; String deviceRel = Build.VERSION.RELEASE;&nbsp; &nbsp; return "samsung".equalsIgnoreCase(deviceMan) && deviceRel.startsWith("4.2.2");}然后在activity的onCreate方法中:if (isSamsung_4_2_2()) {&nbsp; &nbsp; setContentView(R.layout.activity_main_no_toolbar);} else {&nbsp; &nbsp; setContentView(R.layout.activity_main);}正如所指出的,这不是一个明确的解决方案,它只是一种允许用户访问有限功能同时找到更永久解决方案的方法。

犯罪嫌疑人X

正如谷歌集团的#150所说因为小心使用-keep class!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等)如果是三星,各种三星手机都包含在框架或类路径中的旧版Android支持库。如果您使用新材料支持库,您将在这些三星设备上看到此崩溃:java.lang.NoClassDefFoundError: android.support.v7.internal.view.menu.MenuBuilder要解决此问题,您必须重命名该类。最简单的方法是运行proguard。如果你不想混淆,这里有一个1班轮只重命名违规类:-keep class !android.support.v7.internal.view.menu.**,** {*;}跟踪这个问题有一个问题,但由于它确实是一个三星的错误,它永远不会得到修复。在Google / AOSP方面修复它的唯一方法是重命名这些内部类。https://code.google.com/p/android/issues/detail?id=78377
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答