我正在为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行代码,但我认为这不是那么大。
我在网上和搜索中搜索了很多,我做了以下事情:
但我仍然遇到了这个错误。
任何帮助表示感谢。
答案 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()
?)分解成更小的部分。此外,将局部变量转换为类字段似乎可以帮助一些人处理同样的问题。