NoClassDefFoundError: android.Support.v7.interal.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);

这些崩溃来自一系列设备,但总是来自三星,总是来自安卓4.2。

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

  • 检查 Android 项目属性,确保正确添加了 appcompat 库。
  • 检查 JavaBuildPathOrder 和 Export 项目属性,确保选中了 Android 依赖项和 Android 私有库。
  • 确认库中包含该类(android.Support.v7.interal.view.menu. MenuBuilder)。
  • 确认 R.java 位于 android.Support.v7.appcompat 的 gen 目录中。
  • 确认 AppCompat 主题包含在 Manifest.xml 活动中。
  • 清理和重建项目。

尽管采取了这些步骤,尽管它可以在所有其他设备和 Android 版本上运行,崩溃报告还是出来了。

43952 次浏览

是的。三星已经知道 这个的问题了。 我可以建议您尝试使用来自 GitHub的相同的 Popup 实现。这不是最好的办法,但将是有效的。

编辑:

对我有效的解决方案是(使用 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.** {*;}

这要归功于 谷歌集团(google group) ,售价138英镑

旧答案(临时工作区) : 它发生在我使用 旋转操作栏的项目中。我的解决方案是检查这些条件并改变应用程序流程:

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);
}

正如指出的那样,这不是一个确定的解决方案,它只是一种方式,允许用户访问有限的功能,同时找到一个更永久的解决方案。

我使用 Eclipse 项目提供的默认前卫属性启用了前卫,问题已经解决了。根据这里的一些评论,有些人可能不得不重新包装使用: - 重新打包类“ android. support. v7”

你在哪个设备上遇到了这个问题? (三星/HTC 等)

如果是三星,

不同的三星手机在框架或类路径中包含了 Android 支持库的旧版本。如果你使用新的材料支持库,你会在三星的设备上看到这个崩溃:

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

要解决这个问题,必须重命名该类。最简单的方法就是运行前卫。如果你不想混淆,这里有一个1行程序只是重命名违规类:

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

有一个问题跟踪这个问题,但因为它真的是一个三星的错误,它永远不会得到修复在他们的一端。在 Google/AOSP 方面解决这个问题的唯一方法是重命名这些内部类。

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

正如 来自谷歌群组的150英镑所说

因为要小心上课 ! android.Support.v7.interal.view.menu. * * 从应用程序的资源中引用的类。

更好的解决方案是添加以下代码行:

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

这个 MenuBuilder 类在 USB 调试模式下没有找到,我遇到了同样的问题。我通过在 建造,分级的发布和调试 BuildType块中简单地将 MinifyEnable设置为 没错来解决这个问题。像这样:

buildTypes {


debug {


minifyEnabled true
}


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

我将 MinifyEnable设置为真在 调试类型,以防止应用程序崩溃通过 USB 调试到一个现场手机。

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

默认设置为 棒棒糖

步骤

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

当我试图通过 Android Studio 在我的 Samsung Galaxy Tab 3平板电脑上运行“ Hello World”应用程序时,也出现了同样的错误。这个应用程序会看起来启动,然后它会立即崩溃,这个错误会在 Android Studio 的控制台中显示出来。我在平板电脑上做了一个系统更新,现在我可以运行‘ Hello World’应用程序,我不会再收到错误消息了。我希望这能帮助某人解决他们的问题。

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

这个问题在 AppCompat 23.1.1中返回,其中从库 jar 中删除了 .internal包。

正如上面的评论中所建议的(这要归功于在那里提出建议的人) ,现在也需要改变前卫配置。

要想得到上面建议的答案,请尝试将以下代码行添加到前卫文件中:

#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 报告的最后一篇文章,这个问题应该在新版本的支持库(24.0.0)上得到解决: Https://code.google.com/p/android/issues/detail?id=78377#c374

有人把它修好了。

这个版本是可用的 自从上个月以来,所以您应该更新到它。