2013/05/18

Eclipse ADT を Ver. 22 にしたら ClassNotFoundException が発生するようになった

2013/5/18 追記
本件、情報いただきました。
https://twitter.com/droidxav/status/335287826042200064
Google I/O 後に直るそうです。

Eclipse ADT を Ver. 22 にしたら gen ディレクトリ以下が生成されなくなる問題を解決し、ビルドが通るようになったので、これまで動いていたアプリを再ビルドし、実行して見ました。

すると!

FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.test/com.example.test.MainActivity}: java.lang.ClassNotFoundException: Didn't find class "com.example.test.MainActivity" on path: /data/app/com.example.test-2.apk
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2106)
 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
 at android.app.ActivityThread.access$600(ActivityThread.java:141)
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
 at android.os.Handler.dispatchMessage(Handler.java:99)
 at android.os.Looper.loop(Looper.java:137)
 at android.app.ActivityThread.main(ActivityThread.java:5041)
 at java.lang.reflect.Method.invokeNative(Native Method)
 at java.lang.reflect.Method.invoke(Method.java:511)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
 at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.test.MainActivity" on path: /data/app/com.example.test-2.apk
 at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:65)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
 at android.app.Instrumentation.newActivity(Instrumentation.java:1054)
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097)
 ... 11 more

ClassNotFoundException が発生してしまいました。

ClassNotFoundException が発生するケースは、以下のどちらかであることがほとんどです。

  • Reflection の問題 (Manifest の記述ミスとか)
  • Export の問題(Cで言うリンクの問題)
これまで動いていたアプリなので、Reflection の問題である可能性は低いです。
というわけで、Export設定を見てみました。

Project を右クリック → Property → Java Build Path

Android Private Libraries にチェックがついていません。
このプロジェクト、android-support-v4.jar を使用しているため、Android Private Libraries を Export する必要があります。

しかし、Android SDK Tools Rev. 17 以降、libs ディレクトリ以下は自動的に Export されるはず…。
もちろん、android-support-v4.jar は libs ディレクトリ以下においてあります。

しかし、この手の仕様が変わるのはよくあること。
Android Private Libraries にチェックをつけて、ビルドしなおして、実行してみました。
すると、特に問題なく動きました。

どうも libs 以下ににあるだけではダメで、自分で Export するようにしなければならなくなったようです。
ADT Plugin | Android Developers の General Notes には書いていないようですが…。

ちなみに、新規にプロジェクトを作成した場合は、初期設定で Android Private Libraries にチェックがつくようです。

2013/05/17

Eclipse ADT を Ver. 22 にすると R.java が生成されない

Android SDK rev. 22 がリリースされたので、アップデートしてみました。
いつも通り、Eclipse ADT のアップデートも要求さるがままに実行。

すると、ビルドが通らなくなってしまいました。
どうも、gen 以下が作成されていない様子。

「困ったな」と思って探してみたら、既に解決策を見つけてくれている人がいました。

なるほど、Android SDK Build-tools もインストールしないとだめなのね。
おまけに、一度 Rev. 22 にしないとリストに出てこないときてる。
これははまるわー