Android1.6(IS01)で発生する java.lang.VerifyError の対処メモ
IS01で minSdkVersion:4で設定されているアプリが
立ち上がらないという話を聞いて
よちよちで 何時もお世話になっている
@kojiokb さんに急遽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)
のお話。
結論から言うと)
の処に書いている対応は入れているんだけど
Build.VERSION.SDK_INT の分岐が1.6では動かない*1
もしくは IS01だけ効かない*2。
Android LintでNewAPIで引っかかる奴が駄目。
NewAPI 対象の関数の処をtry-catchで囲んでも回避不可。
(java.lang.VerifyErrorでAndroid Runtime Errorで落ちるから)
で、直ぐ見つかる解決策はと言うと
- Android の WebView で特定のボタンが押せなくなる場合がある件 - 某ソフト作者の開発日記
- android - WebView threads never stop (WebViewCoreThread, CookieSyncManager, http[0-3]) - Stack Overflow
とかで書いている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
追記)
ライブラリの参照エラーでも出るらしい
嫌だなあ。今春にAndroidGmailServiceという、javamail-androidを使ったServiceアプリを公開したんだけど、今回、更新しようとしたら、アプリ実行時にjava.lang.VerifyErrorになる。Android SDKを更新したせいだ。困った。
2012-10-08 15:47:09 via web
@penguindaa Android1.6での話なら つ URL
2012-10-08 15:57:23 via YoruFukurou to @penguindaa
@kimukou2628 プロジェクトを見直したら、外部ライブラリを置くフォルダ名がlibになっていました。最近のAndroid SDK、ADTではlibsでないとダメでしたね。libsに変えたら、実行時エラーがなくなりました。ビルドが通るのに、実行時エラーが起きるとは...
2012-10-08 18:13:55 via web to @kimukou2628
ココらへんは新しいADTから
ant buildも含め
- libsにライブラリを置く
- その場合はDepeldency で自動認識
の形になったから。
ただつい最近のASとかだと
デフォルトの新規作成build.gradleのテンプレート(ftl)
がそうなってないので、初学者の人*4ほどハマる人が多いみたい
- $ANDROID_HOME/tools/templates/projects