something problem is comming
Android 4.0とGALAXY Nexusの発表後、Android SDKとその周辺のソフトウェアも直ちにアップデートされた。
Android SDK | Android Developers
機能の追加、変更点に関しては著名なサイトや開発者の方々が早々に訳しているので触れないが、
-
- SDK Tools r14
- Support Package r4
- ADT 14.0.0
これらを全てインストールした後に自作のアプリケーションのAndroid 4.0 Planformに対する互換性をテストしておこうと、まずはアプリケーションをコンパイルしてエミュレータにインストール、実行したのだが久しぶりのメジャーバージョンアップということで案の定上手く動かない。
インナークラスの形式の問題?
[2011-10-21 20:47:37 - EXCEPTION] Dx warning: Ignoring InnerClasses attribute for an anonymous inner class(org.ccil.cowan.tagsoup.Parser$1) that doesn't come with an associated EnclosingMethod attribute. This class was probably produced by a compiler that did not target the modern .class file format. The recommended solution is to recompile the class from source, using an up-to-date compiler and without specifying any "-target" type options. The consequence of ignoring this warning is that reflective operations on this class will incorrectly indicate that it is *not* an inner class.
コンパイラのターゲットの問題?なのか、旧スタイルのインナークラスを処理できない(この場合はTagsoupのPareserクラス)らしいので、Tagsoupのソースコードを入手してビルドし直して作ったjarファイルを使用することでエラーは出なくなった。
クラスは既に追加されている?
[2011-10-21 20:47:37 - xxxxxxxxx] Dx UNEXPECTED TOP-LEVEL EXCEPTION: java.lang.IllegalArgumentException: already added: Lorg/kazzz/action/AbstractActionResult; [2011-10-21 20:47:37 - xxxxxxxxx] Dx at com.android.dx.dex.file.ClassDefsSection.add(ClassDefsSection.java:123) [2011-10-21 20:47:37 - xxxxxxxxx] Dx at com.android.dx.dex.file.DexFile.add(DexFile.java:163) [2011-10-21 20:47:37 - xxxxxxxxx] Dx at com.android.dx.command.dexer.Main.processClass(Main.java:486) [2011-10-21 20:47:37 - xxxxxxxxx] Dx at com.android.dx.command.dexer.Main.processFileBytes(Main.java:455) [2011-10-21 20:47:37 - xxxxxxxxx] Dx at com.android.dx.command.dexer.Main.access$400(Main.java:67) [2011-10-21 20:47:37 - xxxxxxxxx] Dx at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:394)
r12以降でライブラリィの扱いの一部が変更されたが(※1)r14で更に扱いが変わったたのか、従来から使用しているプロジェクトでライブラリィプロジェクトを使用していると内部で追加したライブラリィ(外部jar含む)の参照が重複するらしく上記のようなエラーが出るようだ。(※2)
一旦全てのライブラリィ、外部jarファイルの追加、参照をプロジェクトから除去してその後サイドライブラリィ、外部jarを追加することで、解決できた。(簡単に書いているが、ここに到達するまでに2時間位はかかっている。はっきりいって凄く面倒だった。)
最終的にGingerBreadで動作を確認しているアプリケーションはソースコードを一行を修正せずにIceCream Sandwichのエミュレータ上でも動作した。互換性は確保されているようだ。
※1:ライブラリィプロジェクトとして作成されたプロジェクトで生成されるR.〜.javaのリソースフィールド(int型)が定数(final static)ではなくなった。
※2:従来は外部jarを使用するライブラリィプロジェクトを他のプロジェクトで参照する場合、そのプロジェクトが直接使わないにも関わらずライブラリィで参照している外部jarをプロジェクトでも参照しなくてはならなかった。