2012/04/25

Androidで外部JarがAPKファイルに取り込まれなくなった時の対処法

ひさしぶりに自宅でAndroidアプリを開発しようとして、開発環境をNVIDIAが提供している最新のTegra Android Development Pack 1.0r6に変更したところ、いくつかのアプリケーションで実行時にjava.lang.NoClassDefFoundError:エラーを出して実行できなくなっていました。

どうやらAndroid SDK Tools r17以降(正確にはADT 17.0.0以降)では、外部Jarファイルの扱いについて変更が入った模様です。

Android SDK r17からの変更点について

r17からのJarファイルの取り扱いについて、どのように問題を解決したかは、FoxykeepがHow to fix the “NoClassDefFoundError” with ADT 17にまとめています。

エラー内容

今回の問題は実行時にならないと分からず、Eclipseの中では無事に整合性が取れてコンパイルが通ってしまう事が特徴です。

アプリケーションを実行するとLogCatには次のようなエラーが記録されていました。

04-25 09:51:55.080: E/AndroidRuntime(23064): FATAL EXCEPTION: main
04-25 09:51:55.080: E/AndroidRuntime(23064): java.lang.NoClassDefFoundError: com.google.ads.AdView
04-25 09:51:55.080: E/AndroidRuntime(23064): 	at net.yadiary.android.jpostal.JPostalSearchActivity.onResume(JPostalSearchActivity.java:204)

AdMobは別のディレクトリに最新版を持っていて、複数のアプリケーションからそれを参照する構成になっていました。

解決方法

外部Jarの参照を止めて、次のステップで修正を行ないます。

  • Java Build Pathから外部Jarを参照している項目を全て削除する
  • Refactorでlibディレクトリをlibsに変更する
  • 外部Jarで参照していたJarを作成したlibsにコピーする

これでEclipse上はJava Build Pathにプロジェクト内部のlibsフォルダにあるJarファイルが登録されているはずです。

この状態でアプリケーションを実行したところ、無事にアプリケーションが動き出しました。

さいごに

ADT 17.0.0のリリースノートをみると、libsディレクトリを使う事は変更点としてまとまっています。

ADT 17.0.0リリースノートからの抜粋

Added feature to automatically setup JAR dependencies. Any .jar files in the /libs folder are added to the build configuration (similar to how the Ant build system works). Also, .jar files needed by library projects are also automatically added to projects that depend on those library projects. 

つまり、必要なJarファイルはlibsディレクトリにコピーさえしてくれれば、ADTが勝手に組み込むよ、というわけです

まさか依存関係にあるJarファイルをAPKに組み込まなくなるとは思わなかったので、解決までに時間を取ってしまいました。

0 件のコメント: