Java 8 の言語機能を使う

Android ではプラットフォームのバージョンごとに異なる Java 7 のすべての言語機能と Java 8 の言語機能のサブセットをサポートしています。このページでは、利用可能な新しい言語機能や、それらを利用するためのプロジェクトの適切な設定方法、想定される既知の問題について紹介します。

注: Android 向けのアプリを開発する際は、必ずしも Java 8 の言語機能を使う必要はありません。プロジェクトのソースおよびターゲットの互換性の値を Java 7 に設定しておいても構いませんが、コンパイルには JDK 8 を使う必要があります。

Java 8 の言語機能のサポートには、Jack という新しいコンパイラが必要です。Jack をサポートしているのは Android Studio 2.1 以降のバージョンです。したがって、Java 8 の言語機能を使用する場合は、Android Studio 2.1 を使用してアプリをビルドする必要があります。

既に Android Studio がインストールされている場合は、[Help] > [Check for Update](Mac では、[Android Studio] > [Check for Updates])をクリックして、最新のバージョンにアップデートしていることを確認してください。IDE をワークステーションにインストール済みでない場合は、こちらから Android Studio をダウンロードしてください

サポートされる Java 8 の言語機能と API

Android では Java 8 の全言語機能はサポートしていません。ただし、Android 7.0(API レベル 24)向けにアプリを開発している場合は、次の機能を使用できます。

注: タイプ アノテーション情報を利用できるのは、実行時ではなくコンパイル時のみです。

以前のバージョンの Android でラムダ式、メソッド参照、タイプ アノテーションをテストするには、build.gradle ファイルで compileSdkVersiontargetSdkVersion を 23 以下に指定します。これらの Java 8 機能を使用するには、Jack ツールチェーンを有効にする必要があります。

さらに、次の Java 8 言語機能の API も利用できます。

Java 8 の機能と Jack ツールチェーンの有効化

Java 8 の新言語機能を使うには、Jack ツールチェーンも必要になります。この新しい Android ツールチェーンは、Java 言語のソースを Android で判別可能な dex バイトコードにコンパイルします。さらにこのツールには独自の .jack ライブラリ フォーマットがあり、再パッケージ化、縮小、難読化、Multidex など、ほとんどのツールチェーン機能に対応しています。

以下は、Android の DEX ファイルのビルドに使用する 2 つのツールチェーンの比較です。

  • 以前の javac ツールチェーン
    javac.java.class)→ dx.class.dex
  • 新しい Jack ツールチェーン:
    Jack.java.jack.dex

Gradle の設定

プロジェクトで Java 8 の言語機能と Jack を有効にするには、モジュール レベルの build.gradle ファイルに以下の内容を記載します。

android {
  ...
  defaultConfig {
    ...
    jackOptions {
      enabled true
    }
  }
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

既知の問題点

Instant Run 機能は、現段階では Jack と併用できません。そのため新しいツールチェーンの使用中は無効になります。

Jack はアプリのコンパイル中に中間クラスファイルを生成しないため、中間ファイルに依存するツールは現在 Jack と併用できません。たとえば以下のようなツールが該当します。

  • クラスファイルに作用する Lint Detector
  • アプリのクラスファイルを必要とするツールやライブラリ(JaCoCo での計測テストなど)

Jack の使用中にその他の不具合が発生した場合は、バグの報告をお願いします。