2012/03/28
Android SDK Tools を Rev. 17 にしたら ClassNotFoundException が発生するようになった
2013/5/28 追記
ADT ver. 22 でも ClassNotFoundException が発生するようになりました。
原因は、この ver. 17 での仕様変更が(バグで)無効になったから…
暫定的なバグのようですが、しばらく直らないかもしれませんので、ご注意ください。
穀風: Eclipse ADT を Ver. 22 にしたら ClassNotFoundException が発生するようになった
原因は、この ver. 17 での仕様変更が(バグで)無効になったから…
暫定的なバグのようですが、しばらく直らないかもしれませんので、ご注意ください。
穀風: Eclipse ADT を Ver. 22 にしたら ClassNotFoundException が発生するようになった
1週間ほど前、Android SDK Tools の Rev. 17 がリリースされたとのことで、早速アップデートしてみました。
ところが、これまで動いていたアプリが突然動かなくなってしまったのです。
起動時にいきなり落ちるという悲しい状況。
エラーログは以下のような感じです。
Uncaught handler: thread main exiting due to uncaught exception java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.kokufu.android.apps.xxxx/com.kokufu.android.apps.xxxx.TestActivity}: java.lang.ClassNotFoundException: com.kokufu.android.apps.xxxx.TestActivity in loader dalvik.system.PathClassLoader@44e39248 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2417) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) at android.app.ActivityThread.access$2200(ActivityThread.java:119) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:123) at android.app.ActivityThread.main(ActivityThread.java:4363) 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:860) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.ClassNotFoundException: com.kokufu.android.apps.xxxx.TestActivity in loader dalvik.system.PathClassLoader@44e39248 at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243) at java.lang.ClassLoader.loadClass(ClassLoader.java:573) at java.lang.ClassLoader.loadClass(ClassLoader.java:532) at android.app.Instrumentation.newActivity(Instrumentation.java:1021) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2409) ... 11 more
動いていたものに一切手は入れていませんので、原因は明らかに今回のアップデート。
Updated SDK Tools and ADT revision 17 | Android Developers Blog を確認してみても、それらしい記述はないような…
ん? Support Library もアップデートって書いてある。
で、よくよく見てみると、今回落ちている TestActivity は android.support.v4.app.FragmentActivity を継承していました。
ちょっと試しに FragmentActivity をただの Activity に変更してみました。
すると、ビンゴ。落ちなくなったではないですか。
というわけで、Android Support もアップデート。
当然、アップデートしただけでは反映されないので、
%ANDROID_HOME%\extras\android\support\v4\android-support-v4.jar
を プロジェクトの lib ディレクトリにコピー。
さー、これで大丈夫だろうと起動してみると…
同じじゃないか…orz
おかしいなぁと思ってビルドパスを確認してみると、あれ?
android-support-v4.jar の Export 属性がついてないぞ。
というわけで、 android-support-v4.jar にチェックを入れて再ビルド。←ここ重要。自動でビルドしなおしてくれないので。
で、起動してみると、ちゃんと起動しました。
そもそも、外部ライブラリって Export 属性にいれなくても動くんだっけか?
と今まで動いていた方が不思議な結果になりましたが、とりあえず動作するようになりました。
ちゃんとした理由については継続調査中。
2012/3/29 追記
Updated SDK Tools and ADT revision 17 | Android Developers Blog を再度確認したら、書いてありました。
Added strict dependency support for 3rd party Jar files. You can read more information here.ここの、here に以下のように書いてあります。
Important: If you are still referencing jar libraries manually instead of putting them under libs/ be aware of the following:つまり、libs/*.jar 以外は自動的にエクスポートされなくなったよ。
- If the project is a Library project, these jar libraries will not be automatically visible to application projects. You should really move these to libs/
- If the project is an application, this can work but you must make sure to mark the jar files as exported.
という事らしいです。(lib ではなく libs なので今回私が作っていたアプリはエクスポートされなくなった)
てか、これまでは自動でエクスポートされてたのね。知らなかった…
以下のページを見てみると、どうも Rev. 14 から自動でエクスポートされるように仕様変更されたみたいです。
https://groups.google.com/group/android-group-japan/browse_thread/thread/8fd8e5165a5c38a2
http://code.google.com/p/android/issues/detail?id=21195&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars
うーむ、個人的には、Eclipse の設定等を無視して動作するってのは気に入らない仕様ですねぇ。
Ant での動作と Eclipse の動作をそろえたいというのが動機みたいで、その気持ちはわかるのですが…
0 件のコメント:
コメントを投稿