Android Studio 3.0 Preview 1 でJava 8 がサポート

More than 1 year has passed since last update.


Android Studio 3.0 Preview 1 でJava 8 がサポート

初投稿です。お見苦しいところもあるかと思いますが、ご容赦ください。

普段C# をメインに仕事していて、ラムダ式を積極的に使っています。

それと同じようにAndroid 開発もやりたいのですが、

ラムダ式が使えるJava 8 のサポートが微妙(※1)でした……。

しかし、2017 年に状況が変わったようです。

AndroidでJava 8を使う (2017年版) でも紹介されているように、

Android Studio 次期バージョンで組み込まれるようです。

今回、その出典元と思われる記事Use Java 8 language features を見つけました。

英語の文章なので、翻訳がてらメモしていきたいと思います。

読み間違いがあるかもしれませんが、ご了承くださいm(_ _)m

※1:Jack というコンパイラに差し替えるのですが、ビルド時間が長くてとても困りました(T_T)

Java 8 の言語機能を使う

→ Jack は実用的でなかったので、代わりにRetrolambda を使っていた人が多いのではと思っています。多分……。


導入方法

Android plugin3.0.0-alpha1 以降にして

モジュール直下のbuild.gradle に下記を追加します。

android {

...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}


サポートされるJava 8 の言語仕様、API

Android Studio はすべてのJava 8 の言語仕様をサポートするわけではありません。

しかし、いくつかの言語使用はAndroid Studio の次期バージョンでサポートされる予定です。

ただし、minSdkVersion によっては使えないものがあります。


Java 8 言語仕様

Java 8 言語仕様
minSdkVersion

ラムダ式
条件付きですべて(※1)

メソッドリファレンス
すべて

タイプアノテーション
条件付きですべて(※2)

デフォルトおよび静的インターフェースのメソッド
すべて

反復アノテーション
すべて

※1

ラムダ式シリアライズは、ラムダ式で使われている変数すべてがシリアライズ可能の場合使えます

※2

タイプアノテーション情報はコンパイル時は使えるが、実行時は不可。

またTYPE はAPI 24 以下で使えるが、ElementType.TYPE_USE,ElementType.TYPE_PARAMETER は不可


Java 8 API

Java 8 API
minSdkVersion

java.lang.annotation.Repeatable
Android 7.0(API 24) 以降

AnnotatedElement.getAnnotationsByType(Class)
Android 7.0(API 24) 以降

java.util.stream
Android 7.0(API 24) 以降

java.lang.FunctionalInterface
Android 7.0(API 24) 以降

java.lang.reflect.Method.isDefault()
Android 7.0(API 24) 以降

java.util.function
Android 7.0(API 24) 以降


その他


ツールチェインの移行


Jack

Jack ツールチェインは廃止予定です。

なので、Jack を有効化するjackOptionsbuild.gradle から取り除いてください。

android {

...
defaultConfig {
...
// ここを削除する
jackOptions {
enabled true
...
}
}

// 下記の記述は残す
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}


Retrolambda

Retrolambda はサードパーティのライブラリ向けのJava 8 機能サポートが欠けています。

なので、Retrolambda の記述を取り除き、Android Studio に含まれるツールチェインを使うようにします。

まず、プロジェクトレベルののbuild.gradle の下記の依存性を削除します。

buildscript {

...
dependencies {
// Remove the following dependency.
classpath 'me.tatarka:gradle-retrolambda:<version_number>'
}
}

次にRetrolambda を使っているモジュールのbuild.gradle からretrolambda の記述を削除します。

// 下記を削除する

apply plugin: 'me.tatarka.retrolambda'
...
// Remove this block after migrating useful configurations.
retrolambda {
...
// If you have arguments for the Java VM you want to keep,
// move them to your project's gradle.properties file.
jvmArgs '-Xmx2048m'
}


Java 8 の無効化方法

gradle.properties に下記を追記してください。

android.enableDesugar=false


参考文献