2012/03/28

Android SDK Tools を Rev. 17 にしたら ClassNotFoundException が発生するようになった

2013/5/28 追記
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:
  • 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.
つまり、libs/*.jar 以外は自動的にエクスポートされなくなったよ。
という事らしいです。(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 件のコメント: