Java
Android
IntelliJ

Android 開発で使う JAR を生成する際の注意点

More than 1 year has passed since last update.

前書き

Java を利用した開発において、ある程度まとまった機能は JAR にすると管理が容易になります。

これは Android 開発においても同様のことが言えます。例えば 自作 ImageView を作成した時、ImageView を拡張したソースコードをそのままプロジェクトに入れておくよりも、パッケージにして切り離した方が、他のプロジェクトで利用したくなった時でも容易に使い回す事が出来ます。

しかし、JDK 8 環境において JAR を生成する時は、バージョンの差異に対する対策が必要となります。

コンパイル

IntelliJ IDEA を利用してコンパイルすると、JDK8 環境の場合は バージョン 1.8 のバイトコードを生成します。
しかし、この JAR を Android プロジェクトに含めてコンパイルすると

Error:Gradle: Execution failed for task ':app:preDexDebug'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/usr/lib/jvm/java-8-jdk/bin/java'' finished with non-zero exit value 1

というエラーに見舞われます。
これだけではコンパイラが異常終了したことしか分からないので、もう少し詳しく原因を追ってみると gradle:preDexDebug において

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (0034.0000)

というエラーが発生していることが判明します。

対策

このエラーは、Android 自体が Java 1.7 までの対応であるために、Java 1.8 で生成されたバイトコードを利用できない事が原因です。

これを回避するには、FileSettings より設定画面を開き、Build, Execution, DeploymentCompilerJava CompilerProject bytecode version の値を空白から 1.7 に変更してからコンパイルします。

すると、コンパイル時にバージョン 1.7 のバイトコードを生成するため、Android プロジェクトでも利用できるようになります。