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

  显示原文与译文双语对照的内容
112 0

运行 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);

这些崩溃来自于一个 array 设备,但始终是三星,而且总是安卓 4.2.

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

  • 检查Android项目属性,确保正确添加了appcompat库。
  • 检查 Java Build 路径顺序并导出项目属性,确保已经选中Android依赖项和 Android private 库。
  • 确认该类包含在库( 。MenuBuilder 。internal 。menu 。) 中。
  • 确认 R.java 位于 android.support.v7.appcompat的目录中。
  • 确认AppCompat主题包含在 Manifest.xml Activity 中。
  • 清理和重新生成项目。

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

时间:原作者:0个回答

88 0

编辑:

为我工作的解决方案是( 。使用混淆器) 来替换它:

-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中使用 Spinner 。我的解决方案是检查这些条件并更改应用程序流:

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

然后在 Activity 方法的onCreate中:

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

指出这并不是一个明确的解决方案,只是允许用户访问有限的功能而找到更永久的解决方案。

原作者:
122 4

作为来自谷歌集团的 #150,

因为要注意-keep类安卓。v7.内部。视图。菜单。** 。这里有许多类从appcompat的资源中引用。

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

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