VerifyError - Verifier拒绝了类

时间:2013-02-06 11:01:39

标签: android verifyerror

我正在为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
  • 重新启动模拟器/ device / eclipse
  • 检查构建路径中是否已选中第三方库字段

但我仍然遇到了这个错误。

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:5)

您所描述的步骤可能无济于事。

问题是,这不是达尔维克问题。例如,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()?)分解成更小的部分。此外,将局部变量转换为类字段似乎可以帮助一些人处理同样的问题。