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 plugin を3.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) 以降 |
その他
- Android Studio 3.0 Preview 1 以降では、try-with-resources がすべてのAndroid API レベルで使えるようになります。
→ 今まではAndroid 4.4(API 19) 以降でしか使えませんでした。
→ 参考:JDK7でAndroid開発、していいの?ダメなの?
ツールチェインの移行
Jack
Jack ツールチェインは廃止予定です。
なので、Jack を有効化するjackOptions
をbuild.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
参考文献
- Java 8 の言語機能を使う (170706)
- AndroidでJava 8を使う (2017年版) (170706)
- Use Java 8 language features (170706)
- JDK7でAndroid開発、していいの?ダメなの? (170706)