当前位置: 首页 > 知识库问答 >
问题:

再次获得java。NoClassDefFoundError:android。支持v7。内部的看法菜单i更新后支持工具23

万俟沛
2023-03-14

我已经实现了上面列出的众多解决方案之一https://code.google.com/p/android/issues/detail?id=78377对于此问题,请使用4.2。2部手机,但现在我已经更新了支持工具23,问题又回来了。如果你看那个问题报告,你会发现有很多人在更新后也有同样的问题。NoClassDefFoundError上的解决方案:android。支持v7。内部的看法菜单MenuBuilder也不工作,因为它们来自https://code.google.com/p/android/issues/detail?id=78377

这是我得到的例外:

java.lang.NoClassDefFoundError: android.support.v7.internal.view.menu.i
       at android.support.v7.widget.ActionMenuView.getMenu(ActionMenuView.java:643)
       at android.support.v7.widget.Toolbar.ensureMenu(Toolbar.java:876)
       at android.support.v7.widget.Toolbar.getMenu(Toolbar.java:847)
       at android.support.v7.internal.widget.ToolbarWidgetWrapper.getMenu(ToolbarWidgetWrapper.java:702)
       at android.support.v7.internal.app.ToolbarActionBar.getMenu(ToolbarActionBar.java:583)
       at android.support.v7.internal.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:441)
       at android.support.v7.internal.app.ToolbarActionBar$1.run(ToolbarActionBar.java:65)
       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:776)
       at android.view.Choreographer.doCallbacks(Choreographer.java:579)
       at android.view.Choreographer.doFrame(Choreographer.java:547)
       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:762)
       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(Method.java)
       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(NativeStart.java)

我的proguard有:

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

有什么解决办法吗?收到用户的大量投诉。

共有1个答案

仲孙经赋
2023-03-14

您的ProGuard“keep class”规则需要更新,因为目标类不再模糊。在支持工具的第23版中,Google将菜单相关类从内部包中移出。我可以确认,以下ProGuard规则消除了运行Android 4.2的某些三星设备上出现的NoClassDefFoundError。2.

# Workaround for conflict with certain OEM-modified versions of the Android appcompat
# support libs, especially Samsung + Android 4.2.2
# See this thread for more info:
#   https://code.google.com/p/android/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars&groupby=&sort=&id=78377
-keepattributes **
# Keep all classes except the ones indicated by the patterns preceded by an exclamation mark
-keep class !android.support.v7.view.menu.**,!android.support.design.internal.NavigationMenu,!android.support.design.internal.NavigationMenuPresenter,!android.support.design.internal.NavigationSubMenu,** {*;}
# Skip preverification
-dontpreverify
# Specifies not to optimize the input class files
-dontoptimize
# Specifies not to shrink the input class files
-dontshrink
# Specifies not to warn about unresolved references and other important problems at all
-dontwarn **
# Specifies not to print notes about potential mistakes or omissions in the configuration, such as
# typos in class names or missing options that might be useful
-dontnote **

我强烈建议您使用dex2jar和jd来确认所需的混淆已经发生(如下所述:https://stackoverflow.com/a/10191338/315702)。很遗憾,每次升级支持工具时都应执行此操作,以防再次移动或重命名包。

Google将这些类从“内部”包中移出,希望这样可以避免导致NoClassDefFoundError的类路径冲突。然而,正如Chris Banes在这个bug的线程中所说的那样(https://code.google.com/p/android/issues/detail?id=78377),他们没有进行测试来验证修复程序——此后许多人报告了与您看到的相同的崩溃:

好的,我们决定对内部类进行一次性重命名,这样可以解决这个问题。不过,我还没有在这些设备上做过测试,也不打算做任何测试。

 类似资料:
  • 这是我的密码。 我可以这样做吗? 谢谢你。

  • 我有一个没有动作栏主题的appcompat活动。我在活动中运行一个片段来显示项目列表。项目以两种模式显示:列表和删除。当屏幕打开时,它始终处于列表模式。两种显示模式下的动作条是不同的。在列表模式下,在操作栏的右侧有两个菜单项,当片段打开时会显示出来。当我从删除模式回到列表模式时,菜单项不会膨胀。如何使菜单项膨胀,同时从删除模式到列表模式。 进入屏幕后,用户进入列表模式。我有setHasOption

  • 问题内容: 这是我的代码。 我可以做这样的事情吗? 谢谢。 问题答案: 更新2014年2月9日: JDK 8 引入了lambdas(匿名函数表达式),您可以像这样解决它: (JDK 7及更低版本) 不,Java不支持“直接”嵌套方法。(尽管大多数功能语言都支持,包括一些JVM语言,例如Scala和Clojure!) 虽然仅供参考;你 可以 (方法中的类)定义局部类,所以这 确实 编译 请注意,尽管

  • 在Web开发中对于这样的一个流程可能很眼熟: 打开一个网页显示出表单。 用户填写并提交了表单。 如果用户提交了一些无效的信息,或者可能漏掉了一个必填项,表单将会连同用户的数据和错误问题的描述信息返回。 用户再次填写,继续上一步过程,直到提交了一个有效的表单。 在接收端,脚本必须: 检查用户递交的表单数据。 验证数据是否为正确的类型,合适的标准。例如,如果一个用户名被提交,它必须被验证是否只包含了允

  • 北京优锘科技有限公司 地址:北京市朝阳区酒仙桥路10号恒通国际商务园B23A 联系电话:400-666-9832 业务咨询:info@uino.com 售后服务:thingjs@uino.com