Android 3.0で発生する互換性問題など (速報版)
先日Android 3.0 SDKの正式版がリリースされました。
すぐに既存のアプリを3.0のエミュレータで実行したのですが、その際に発生した問題を備忘録を兼ねてまとめてみます。
※記載内容に間違いがある可能性もありますので、間違っている場合にはご指摘下さい。
2011/07/18 追記: 追加情報をこちらに記載しました!
– Deprecatedになったメソッド –
AndroidはDeprecatedになったメソッドへの扱いがとても雑です。いきなり動かなくなったり、例外が発生する様になり、とても開発者泣かせです。
詳細については以前まとめた 「Androidのdeprecatedメソッドの注意点」を参照頂くとして、以下ではAndroid 3.0で確認できたDeprecatedなメソッドの問題を記載します。
– ConvenienceなメソッドがDeprecatedになり例外発生 –
以下のConvenienceなメソッドを使用している場合、画面遷移して戻って来た時に再度呼び出すと IllegalStateExceptionが発生する様になりました。
※Convenienceなメソッドとは、簡単に呼び出せるように間接的に機能を提供しているメソッドの事です。「Convenience」という表記は、AndroidのAPIドキュメントにも記載があります。
Context#managedQuery (Uri, String[], String, String[], String)
このメソッドは、Content ProviderにSQLを投げる時に使用するConvenienceなメソッドです。
例外の詳細は以下の通りです。
java.lang.RuntimeException: Unable to resume activity {com.skyarts.android.XXXXX/com.skyarts.android.XXXXX.XXActivity}: java.lang.IllegalStateException: trying to requery an already closed cursor
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2215)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2243)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1019)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:126)
at android.app.ActivityThread.main(ActivityThread.java:3997)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalStateException: trying to requery an already closed cursor
at android.app.Activity.performRestart(Activity.java:4343)
at android.app.Activity.performResume(Activity.java:4366)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2205)
... 10 more
原因は、Context#managedQuery (Uri, String[], String, String[], String)メソッドが Deprecatedになった為の様です。
いきなり例外発生がするようになるとは酷い話ですが、これがAndroidです(笑)
例外が発生しない様にするには、以下の2通りの方法で該当メソッドを使用しないようにすればOKだと思います。
- 代わりに ContentResolver#query(Uri, String[], String, String[], String)メソッドを呼び出す
- Android 3.0で追加された android.content.CursorLoaderクラスを使う
– Service呼び出し –
存在しないServiceに対して以下のメソッドでbindしようとすると例外が発生します。存在する場合には例外は発生しないようです。
内部で落ちているだけで実際に例外を投げてくる訳では無いようですが、気になります。
Context#bindService(Intent, ServiceConnection, int)
例外の詳細は以下の通りです。
※ServiceをbindServiceで呼び出した後にunbindServiceで解放していない場合にも出るかも知れません。
Activity com.skyarts.android.XXXXX.XXActivity has leaked
ServiceConnection com.skyarts.android.XXXXX.XXActivity$3@4076d0d8 that was originally bound here
android.app.ServiceConnectionLeaked: Activity com.skyarts.android.XXXXX.XXActivity has leaked ServiceConnection com.skyarts.android.XXXXX.XXActivity$3@4076d0d8 that was originally bound here
at android.app.LoadedApk$ServiceDispatcher.(LoadedApk.java:923)
at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:818)
at android.app.ContextImpl.bindService(ContextImpl.java:1063)
at android.content.ContextWrapper.bindService(ContextWrapper.java:370)
at com.skyarts.android.XXXXX.XXActivity.onCreate(TextEditorActivity.java:311)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1700)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1752)
at android.app.ActivityThread.access$1500(ActivityThread.java:123)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:993)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:126)
at android.app.ActivityThread.main(ActivityThread.java:3997)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
at dalvik.system.NativeStart.main(Native Method)
– その他 –
その他以下の問題も見つかっています。
- ListViewで矢印キーなどで項目を移動すると、項目の文字が消える、または薄くなる場合がある(デフォルトのレイアウトを使っても発生する)
- 背景が黒ベースになったので、浮いてしまうアイコンがある
– まとめ –
Android 3.0になり、開発環境にも以下の問題が発生しています。
- エミュレータの動作が更に遅くなって実用レベルではなくなってきている(笑)
- ADT 10.0.0(Android SDKのEclipseのPlug-in)でAVDマネージャーが開かなくなった(NoSuchMethodErrorが発生して落ちている模様)
2011/03/08 追記 : この問題はEclipse 3.5の時に出るようです。3.6にする事で発生しなくなります。 - Google API 11のエミュレーターは、ライセンス管理の「Licensing Verification Library(LVL)」が使えない。(該当サービス自体が無い様で、この問題は2.3の時からです(苦))
なお、既存アプリを Android 3.0向けにするには、公式ページの 「Optimizing Apps for Android 3.0」などを参考にして下さい。
私ども SkyArtsでは、iPhone、Androidアプリなどのコンサルティングも承っております。
※ServiceをbindServiceで呼び出した後にunbindServiceで解放していない場合にもでるかも知れません。