Android 用の私の Java プロジェクトには、いくつかの構成があります。以前はそれらを切り替えて eclipse から手動で apk をビルドしていましたが、最近はもっと簡単にするためにいくつかの ant タスクを開発しました: cmd ファイルを起動すると、すべての構成がビルドされます (毎回構成変数を変更し、リソースを移動し、マニフェストを変更し、等。)。
しかし今日、Android ワークフロー (私の build.xml には ${sdk.dir}/tools/ant/build.xml が含まれています) を使用して ant (javac を使用) によってコンパイルされたコードは、Eclipse の ADT ツールによって生成されたコードとは異なることがわかりました。 . そして違いは致命的です。
コンパイル段階で javac は、一部のファイルに BOM が含まれており、1 つのクラスが (多くの静的配列に対して) 大きすぎると主張しました。すべてのファイルを bom なしで utf8 に変換し、大きなクラスを 2 つに分割し、javac に問題はなくなりました。簡単でした。
ただし、4.0.x デバイスまたはエミュレーターで ant-made apk を起動すると (1.6、2.2、4.1、4.2 で動作します)、実行時に強制終了し、次のように表示されます。
03-01 09:15:16.247: W/dalvikvm(1993): VFY: register1 v3 type 17, wanted 18
03-01 09:15:16.247: W/dalvikvm(1993): VFY: rejecting opcode 0xc8 at 0x0023
03-01 09:15:16.247: W/dalvikvm(1993): VFY: rejected Lcom/myproj/MySomeClass;.doThing (I)V
03-01 09:15:16.247: W/dalvikvm(1993): Verifier rejected class Lcom/myproj/MySomeClass;
03-01 09:15:16.247: W/System.err(1993): java.lang.VerifyError: com/myproj/MySomeClass
...
<stack here>
...
しかし、eclipse-adt-made apk は 4.0.x でかなりうまく動作します! さらに、コンパイル時にutf bomまたはクラスサイズに関するadtクレームを見たことはありません。
したがって、ant ビルドでは javac 以外のものを使用する必要があると思います。しかし、Google は build.xml で正確に javac を使用しています。ant でビルドするときに、javac の代わりに ADT コンパイラを使用するにはどうすればよいですか?
もちろん、Eclipse でビルドを作成することもできますが、ant スクリプトは、私が 20 分かかるのに 1 分かかります。また、cfg 変数を変更するときにばかげた間違いを犯すことはありません (それらの間にいくつかの依存関係があります)。
前もって感謝します!
UPDT: 私が使用している Java のバージョンと何らかの関係があると思われます。Ant は 1.7 x86 jdk で実行されますが、Eclipse は jdk1.6.0_26 x64 を使用します。Dalvik dex は一部の Java 1.7 バイトコードを理解できないと誰かが言っていますが、確認する必要があります。
UPDT1: いいえ、すべての jdk を削除してから、jdk 1.6.0_41 x86 と x64 の両方をインストールし、Eclipse を 1.6.0_41 x64 で動作するように設定し、JAVA_PATH を jdk 1.6.0_41 x86 に設定しました。同じこと-Eclipseでコンパイルされたapk(Androidツール->署名付きapkのエクスポート)が機能し、antでコンパイルされたapkはVerifyErrorと言います。