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

Mat*_*t K 170 java eclipse android android-appcompat

运行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)
Run Code Online (Sandbox Code Playgroud)

这是CustomActivity.java的第215行:

PopupMenu popup = new PopupMenu(CustomActivity.this, mImageViewMenu);
Run Code Online (Sandbox Code Playgroud)

崩溃来自一系列设备,但总是三星,而且始终是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版本上工作,但崩溃报告仍然存在.

uni*_*ify 100

编辑:

对我有用的解决方案是(使用Proguard)来替换它:

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

-keep class android.support.v7.** { *; }
-keep interface android.support.v7.** { *; }
Run Code Online (Sandbox Code Playgroud)

有了这个:

# 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.** {*;}
Run Code Online (Sandbox Code Playgroud)

归功于谷歌集团,#138.

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

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");
}
Run Code Online (Sandbox Code Playgroud)

然后在activity的onCreate方法中:

if (isSamsung_4_2_2()) {
    setContentView(R.layout.activity_main_no_toolbar);
} else {
    setContentView(R.layout.activity_main);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 将它添加到你的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.**{*; } (7认同)
  • @JaredBurrows你没有删除库,你只是告诉proguard默认忽略它,使用修复你忽略android.support下的所有内容除了android.support.v7.internal.view.menu (3认同)
  • 当II升级到AppCompat v23时,我的应用程序中返回了该问题.我分析了AppCompat v.23.1.1 jar文件,看到他们已经删除了v7中的"internal"目录,所以看起来Proguard指令行现在应该是:[-keep class!android.support.v7.view. menu.**,android.support.**{*;}]我仍然没有在发生问题的真实设备上进行测试确认.有这样一个设备的人可以测试这个吗?或者删除'内部'目录实际上是问题的解决方案,我们不需要再乱用Proguard类重命名了? (3认同)
  • 其他人可以验证这个答案吗?我无法访问三星,我正在处理的应用程序不再处于活动状态,因此我无法测试它. (2认同)
  • 我已经使用该问题报告中的解决方案已经好几个月了,并且在更新到最新的支持库和sdk 23之后突然间我已经开始收到有关crashlytics的新报告:`java.lang.NoClassDefFoundError:android.support .v7.internal.view.menu.i` (2认同)
  • @AndreaBellitto我想你错过了代码中的"\*".它应该是:-keep class!android.support.v7.internal.view.menu.*MenuBuilder*,android.support.v7.**{\*; -keep interface android.support.v7.**{\*; } (2认同)
  • @akousmata我们的测试证实,其根源问题被固定在支持LIB 24.0.0.(官方发布,不只是alpha.)我们升级到24.0.0,删除了ProGuard混淆解决方法,在我们之前看到崩溃的三星设备上进行了测试,我们不再看到它. (2认同)

Pon*_*pat 26

正如谷歌集团的#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.** { *; }
Run Code Online (Sandbox Code Playgroud)

  • @William有人删除了它,不知道为什么.无论如何,这是我的解决方案:```-keep class!android.support.v7.internal.view.menu.*实现android.support.v4.internal.view.SupportMenu,android.support.v7.**{*; }``` (3认同)
  • 这对我来说很有用`-keep class!android.support.v7.internal.view.menu.**,**{*;}`不能再用*v23*of*app compat*了. (3认同)
  • 在23.1.1支持库中修改了内部包路径,所以现在正确的proguard设置是:-keep class!android.support.v7.view.menu.*MenuBuilder*,android.support.v7.**{*; -keep interface android.support.v7.**{*; } (2认同)

Gan*_*oid 23

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

如果是三星,

各种三星手机都包含在框架或类路径中的旧版Android支持库.如果您使用新材料支持库,您将在这些三星设备上看到此崩溃:

java.lang.NoClassDefFoundError: android.support.v7.internal.view.menu.MenuBuilder
Run Code Online (Sandbox Code Playgroud)

要解决此问题,您必须重命名该类.最简单的方法是运行proguard.如果你不想混淆,这里有一个1班轮只重命名违规类:

-keep class !android.support.v7.internal.view.menu.**,** {*;}
Run Code Online (Sandbox Code Playgroud)

跟踪这个问题存在一个问题,但由于它确实是一个三星的bug,所以它永远不会得到修复.在Google/AOSP方面修复它的唯一方法是重命名这些内部类.

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

  • @Android007:谢谢你指出实际工作的解决方法.然而,似乎没有人能够解释为什么在其bootclasspath中嵌入旧的Android支持库的错误ROM会导致此异常,因为缺少"android.support.v7.internal.view.menu.MenuBuilder"类可用于. apk DEX代码的应用程序遭受此问题.你有没有任何指针可以解释Android运行时如何加载从bootclasspath jar/dex文件和应用程序中获取的类?还是有任何确切的解释? (2认同)

RWI*_*WIL 15

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

正如上面的评论中所建议的那样(对于在那里提出建议的人的信用),现在也必须改变proguard配置.

要获得上面建议的答案,请尝试将这些行添加到proguard文件中:

#FOR APPCOMPAT 23.1.1:
-keep class !android.support.v7.view.menu.*MenuBuilder*, android.support.v7.** { *; }
-keep interface android.support.v7.* { *; }
Run Code Online (Sandbox Code Playgroud)

而不是旧的修复:

#FOR OLDER APPCOMPAT VERSION:
-keep class !android.support.v7.internal.view.menu.*MenuBuilder, android.support.v7.** { ; }
-keep interface android.support.v7.* { *; }
Run Code Online (Sandbox Code Playgroud)


and*_*per 12

根据错误报告的最新帖子,这应该在新版本的支持库(24.0.0)上修复:https://code.google.com/p/android/issues/detail? id = 78377 #c374

甚至有人声称它修复了它.

此版本自上个月开始提供,因此您应该更新它.