9

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をリセットする
  • エミュレータ/デバイス/日食を再起動します
  • ビルドパスでサードパーティライブラリフィールドがチェックされていることを確認しました

しかし、私はまだそのエラーを受け取っています。

助けていただければ幸いです。

4

1 に答える 1

7

あなたが説明したステップはおそらく役に立たないでしょう。

問題は、Dalvikの問題ではないということです。たとえば、OracleJavaVMでも同様のベリファイアが採用されています。簡単な答え:あなたの方法は複雑すぎます。表示されるエラーは、主に多すぎることが原因です。

  • パラメーター
  • ローカル変数
  • 例外ハンドラ
  • コード命令

より正確には、この問題は次のスレッドで説明されています: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()?)を小さな部分に分割する必要があります。また、ローカル変数をクラスフィールドに変換することは、同じ問題を抱えている一部の人々を助けるように思われました。

于 2013-02-06T11:42:36.303 に答える