【问题标题】:VerifyError - Verifier rejected classVerifyError - 验证者拒绝类
【发布时间】:2013-01-21 13:17:20
【问题描述】:

我正在为 2.2 (minSdkVersion=8) 开发,但突然出现此错误:

arbitrarily rejecting large method (regs=75 count=28584)
rejected Lcom/Demo/Loyalty/SelectType;.onClick (Landroid/view/View;)V
Verifier rejected class Lcom/Demo/Loyalty/SelectType;
Class init failed in newInstance call (Lcom/Demo/Loyalty/SelectType;)


java.lang.VerifyError: com.Demo.Loyalty.SelectType
at java.lang.Class.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1429)
at android.app.Instrumentation.newActivity(Instrumentation.java:1022)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
at android.app.ActivityThread.access$2300(ActivityThread.java:125)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
at dalvik.system.NativeStart.main(Native Method)

到目前为止一切正常。

注意:SelectType 类有大约 16000 行代码,但我猜这并没有那么大。

我在网上搜索了很多,从答案中,我做了以下:

  • 清理项目
  • 重置 ADB
  • 重启模拟器/设备/eclipse
  • 已检查第三方库字段是否已在构建路径中检查

但我仍然收到该错误。

任何帮助表示赞赏。

【问题讨论】:

    标签: android verifyerror


    【解决方案1】:

    您描述的步骤可能没有帮助。

    问题是,这不是 Dalvik 的问题。例如,在 Oracle Java VM 中使用了类似的验证器。简单的回答:你的方法太复杂了。你看到的错误主要是因为太多了:

    • 参数
    • 局部变量
    • 异常处理程序
    • 代码说明

    更准确地说,该问题已在此线程中描述:https://groups.google.com/forum/?fromgroups=#!topic/android-developers/4qNoIdBHYFc

    引用:

    (寄存器数*指令字数)的值为 大于 2^21。 (...) 它的目的是 防止验证程序膨胀应用的本机堆。

    您还可以在此处查看类似的报告:http://www.mentby.com/Group/android-developers/verifyerror-arbitrarily-rejecting-large-method.html 并提供有关如何解决问题的提示:

    是的,Dalvik 编译器尝试为每个 方法中的局部变量。应该能处理这么多, 但显然不能。通过使它们成为实例变量,您可以删除 编译器需要/渴望“管理”它们(并制作方法 小很多)。

    所以要解决它,您通常应该将大方法(可能是onClick()?)分解成更小的部分。此外,将局部变量转换为类字段似乎对一些有同样问题的人有所帮助。

    【讨论】:

    • 但在我的情况下,我怎么知道是哪种方法导致arbitrarily rejecting large method (regs=75 count=28584) 发生?
    • 最大的 :D 但严重的是,它在警告中:com.Demo.Loyalty.SelectType.onClick()
    • 啊,这是你的问题。有效长度为 100 行。所以这相当容易 - 只需将代码块粘贴到辅助方法即可。关键是在那个onClick() 方法中降低方法长度和/或变量数量。你不必担心别人。
    • ...直到达到 Android 的方法限制
    • 对于我来说,使用带有 N 预览的 jack 和 java 1.8 会导致这个问题。因此,如果您打开了它,请尝试关闭千斤顶并返回到 1.7。这是android studio 2.2的预览1
    猜你喜欢
    • 1970-01-01
    • 2021-02-15
    • 2017-06-11
    • 1970-01-01
    • 2021-02-27
    • 2016-05-22
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多