読者です 読者をやめる 読者になる 読者になる

Android1.6(IS01)で発生する java.lang.VerifyError の対処メモ

 IS01で minSdkVersion:4で設定されているアプリが
立ち上がらないという話を聞いて

よちよちで 何時もお世話になっている
@ さんに急遽IS01をお借りすることに。
とても感謝しています〜。ありがとうございます。


その場でapkだけ入れてみたら


06-10 02:26:02.923: E/AndroidRuntime(2800): Uncaught handler: thread main exiting due to uncaught exception
06-10 02:26:03.047: E/AndroidRuntime(2800): java.lang.VerifyError: XXXX
06-10 02:26:03.047: E/AndroidRuntime(2800): at java.lang.Class.newInstanceImpl(Native Method)
06-10 02:26:03.047: E/AndroidRuntime(2800): at java.lang.Class.newInstance(Class.java:1472)
06-10 02:26:03.047: E/AndroidRuntime(2800): at android.app.Instrumentation.newActivity(Instrumentation.java:1101)

ようは
id:tomorrowkey さんの

のお話。

結論から言うと)

の処に書いている対応は入れているんだけど

Build.VERSION.SDK_INT の分岐が1.6では動かない*1
もしくは IS01だけ効かない*2

 Android LintでNewAPIで引っかかる奴が駄目。
NewAPI 対象の関数の処をtry-catchで囲んでも回避不可。
(java.lang.VerifyErrorでAndroid Runtime Errorで落ちるから)

で、直ぐ見つかる解決策はと言うと

とかで書いているRefrection経由で呼べって話。*3


 でもSDK_INTの分岐処理は
2.1系 とかは普通に分岐は出来ていて
たとえばStrictModeの分岐とか普通に使えてる(target11以上 else target9以上とか)
Android StrictMode penaltyFlashScreen | Taosoftware Developer Blog
のお話とか・・。1.6が駄目駄目さんなのか・・・


 リフレクションで対応=>えーきついな・・・1.6対応
と考えていたんですが,yanzmさんのブログのリンクの参照先で

分岐した処理をわざわざ別クラスにしている記述があり、それを試してみたら=>ああいけたって感じ

  • 1.6 では一度でも参照しないクラスに置く必要があり
    • 読込と全なめするので触らないクラスに退避する必要があり
    • =>ActivityUtilクラス,MouseUtil クラス新設



ようは1.6(target 4)だとActivity上に直に記載してしまうと変に参照してしまい駄目という結論・・
こういう記述みるとやっぱりAndroidって変だね。。と思う。


備考)
IS01でつかったショートカット操作


 アンダーバー Alt+Shiftキー+\
 音量調節:  alt+8と9

追記)
ライブラリの参照エラーでも出るらしい

ココらへんは新しいADTから
ant buildも含め

  • libsにライブラリを置く
  • その場合はDepeldency で自動認識

の形になったから。

ただつい最近のASとかだと
デフォルトの新規作成build.gradleのテンプレート(ftl)
がそうなってないので、初学者の人*4ほどハマる人が多いみたい

  • $ANDROID_HOME/tools/templates/projects

*1:一応target 4からサポート記述はあるが

*2: IS01!=Build.MODELな話も駄目

*3:ちなみにActivity関連だけではなかったですorz

*4:Androidなんてコピペで出来るから勉強する必要ないよね な人