ものがたり(旧)

atsushieno.hatenablog.com に続く

Java 7でandroid apkをビルドできない問題の解決方法

小ネタ。kernel.orgクラック以来落ちっぱなしのandroid.git.kernel.orgが復旧したら書こうと思っていたのだけど、全然戻ってこないので、ソースへのリンク無しで書いちゃえ。

Java 7 SDKでビルドした.classファイルは、そのままではAndroidのDalvikのclasses.dex(apkに含まれているdalvikのバイトコードを全部まとめたやつ)に変換することができない。これはdxの com.android.dx.dex.cf.CfTranslator#translate() に渡されている com.android.dx.dex.cf.CfOptions のstrictNameCheckフィールドがデフォルトでtrueになっていて、com.android.dx.cf.direct.DirectClassFile が入力classファイルのバージョンをチェックして、51 (0033h) を拒絶するようにしているためだ。

だから、Java 7環境で生成したクラスファイルを対象にdxを実行すると、以下のようなメッセージが出てきて、そのクラスはclasses.dexに含まれないことになる:


trouble processing:
bad class file magic (cafebabe) or version (0033.0000)
...while parsing foo/bar/Baz.class
...while processing foo/bar/Baz.class

これを回避するには、コマンドラインツールのdxであれば、--no-strictオプションを渡してやると良い。その他の方法で直接CfTranslatorを呼び出しているのであれば、上記のstrictNameCheckをfalseにして処理すると良い。

ただしJava 7のバイトコードをdxが従来通りに処理してくれるかどうかは分からない(そのためにバージョンチェックがあって、それをoffにして使っているということは心に留めておくべき)。