はじめに
Java 8+ API desugaring1 のメモです。
概要
◆ 特徴
minSdkVersion 的に非対応の Java 8 の機能を使えるようにします。
例えば、API 26 から追加された DateTimeFormatter が、API 25 以下の端末上でも利用できるようになります。
// SimpleDateFormat はスレッドセーフではないので何とかしたい
SimpleDateFormat("yyyy-MM-dd", Locale.US)
// DateTimeFormatter を使えばスレッドセーフになる
// → だけど API 26 からしか使えない、、、
// → そうだ、desugaring があるじゃないか!
DateTimeFormatter.ofPattern("yyyy-MM-dd", Locale.US)
◆ desugaring 前
minSdkVersion 的に非対応の Java 8 の機能を使用すると、Android Studio 上では警告が表示されます。
ビルドは実行できますが、当該ライブラリが含まれない端末では実行時にエラーとなります。
◆ desugaring 後
ビルドも実行もでき、当該ライブラリが含まれない端末での実行も問題なく行うことができます。
条件
Android Gradle Plugin 4.0.0 以降
対象API
※ java.time
, java.util.Optional
, ConcurrentHashMap
(bug fix 済み) など
設定
minSdkVersion > 20 の場合
android {
compileOptions {
coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.9'
}
minSdkVersion <= 20 の場合
android {
defaultConfig {
// Required when setting minSdkVersion to 20 or lower
multiDexEnabled true
}
compileOptions {
coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.9'
}