Android開発でKotlin 2.0, JDK 21を使う:おまけJetpack Composeの互換性
はじめに
JetBrainsは開発ツールに対して、常に最新のものを利用するように推奨している。枯れた技術を使うようにするという、以前のシステム開発とは異なる。
JDKも新しいものにするとこれまで不便だった部分が解消されて、コードが簡単になることもある。これは魅力的だが、トレードオフもある。
以下に注意点を挙げる。
- JDK21がフルサポートされているのはAndroid 15以降
- Kotlin 2.0についてはJDK 8以降ならJava変換時に対応してくれる
- Jetpack Composeについては別途注意が必要
Androidの各バージョンがサポートするJDKのバージョン対応表は、次の表の通り。AndroidのART(Android Runtime)およびDalvik VMは、特定のJDKのバージョンまでの機能をサポートしており、対応状況を把握することが重要である。
Androidバージョンと対応JDK一覧
Android バージョン | API レベル | 対応 JDK バージョン | 備考 |
---|---|---|---|
Android 15 (2024) | 35 | JDK 21 | 最新のPixel向け、Kotlin 2.0対応 |
Android 14 (2023) | 34 | JDK 17 | パフォーマンス改善、GC強化 |
Android 13 (2022) | 33 | JDK 11 | JDK 11のコア機能対応 |
Android 12 (2021) | 31 | JDK 11 | java.time の完全対応 |
Android 11 (2020) | 30 | JDK 8(部分的にJDK 11) | 公式はJDK 8、デフォルトコンパイルはJDK 8相当 |
Android 10 (2019) | 29 | JDK 8 | 標準対応 |
Android 9 (2018) | 28 | JDK 8 | Desugar によりJDK 8の多くの機能が利用可能 |
Android 8.1 (2017) | 27 | JDK 8 | Java 8の一部API(default methods 、streams )が利用可 |
Android 8.0 (2017) | 26 | JDK 8 | DesugarでJava 8機能を一部サポート |
Android 7.1 (2016) | 25 | JDK 8(部分的) | Desugarを用いて拡張可 |
Android 7.0 (2016) | 24 | JDK 8(部分的) | Retrolambda等の技術が必要 |
Android 6.0 (2015) | 23 | JDK 7 | 一部JDK 8は外部ツールで利用可 |
Android 5.1 (2015) | 22 | JDK 7 | 公式はJDK 7推奨 |
Android 5.0 (2014) | 21 | JDK 7 | ART導入(Dalvik廃止) |
Android 4.4 (2013) | 19 | JDK 6 | Dalvik VMの最適化 |
Android 4.1-4.3 (2012-2013) | 16-18 | JDK 6 | 32ビットのART実装なし |
Android 4.0 (2011) | 15 | JDK 6 | Ice Cream Sandwich |
補足事項
- JDK 8のDesugar対応(Android 24以降)
- Android 7.0(API 24)以降では、“Desugar” という技術を利用することで、ランタイムがJDK 8を完全にサポートしていなくても、コンパイル時にJava 8の機能(
lambda
,stream API
,default methods
など)を使用可能になっている。
- JDK 11以降の対応
- Android 12(API 31)以降では、JDK 11の主要なAPI(
java.time
、var
など)が公式にサポートされていまる。 - Android 14(API 34)からは、JDK 17のサポートが追加されている。
- JDK 21とAndroid 15
- 最新のAndroid 15(API 35)では、JDK 21のフル機能が利用可能で、
record patterns
やsealed classes
などの新機能がAndroidアプリで活用できる。
開発時の考慮ポイント
- 古いAndroidデバイスの対応を考慮する場合:
sourceCompatibility
およびtargetCompatibility
をJavaVersion.VERSION_1_8
(JDK 8)に設定するのがベスト。- Android 6(API 23)以前ではJDK 7が安全な選択。
- 最新技術を活用したい場合:
- Android 12以上のデバイスをターゲットにし、JDK 11やJDK 17の新機能を活用。
- Pixelシリーズのみを対象とするなら、Android 15 + JDK 21で最新技術を導入。
- 最低限の互換性と最新機能のバランス:
- JDK 8 (
targetCompatibility=1.8
) に留め、coreLibraryDesugaring
を活用すれば、Android 5.0以上で互換性を保ちつつ、ある程度の新機能が利用可能。
- JDK 8 (
互換性を考慮したGradle設定例
古いデバイスとの互換性を維持(Android 5.0以上対応)
android {
compileSdk 33
defaultConfig {
minSdk 21
targetSdk 33
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
}
dependencies {
coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:2.0.3"
}
最新Pixel専用アプリ(Android 15 + JDK 21)
android {
compileSdk 35
defaultConfig {
minSdk 33 // Android 13以上
targetSdk 35
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_21
targetCompatibility JavaVersion.VERSION_21
}
kotlinOptions {
jvmTarget = "21"
}
}
まとめ
- JDK 8(1.8): Android 5.0~対応(最も互換性が高く、安全)
- JDK 11: Android 12~(最新機能を活用)
- JDK 17: Android 14~(より高度な機能)
- JDK 21: Android 15~(最先端技術向け)
ターゲットとするAndroidの最低バージョンを考慮し、適切なJDKバージョンを選択することで、最適なアプリ開発が可能。
Jetpack Compose利用上の注意点
Jetpack Compose は、Android 5.0 (API 21) 以降では 公式にはサポートされていない。Jetpack Compose を使用する場合、最小対応バージョン(minSdkVersion)は Android 6.0 (API 23) 以上が必要。
Jetpack Compose の最小 API 要件
Jetpack Compose の各バージョンごとの最小サポート API レベルは以下の通り:
Jetpack Compose バージョン | 最小 API レベル (minSdkVersion) | 備考 |
---|---|---|
Compose 1.6 以降 (最新まで) | API 23 (Android 6.0) | Jetpack Compose の現行安定版 |
Compose 1.5 | API 21 (Android 5.0) (非推奨) | 最新版では非推奨 |
Compose 1.4 以前 | API 21 (Android 5.0) | 旧バージョンは一応動作可能 |
重要ポイント:
- Jetpack Compose 1.5 以降では API 23(Android 6.0)以上が必要になった。
- API 21 (Android 5.0) では、Compose 1.4 以前のバージョンを使用すれば動作可能だが、新機能や最適化が得られない。
- Googleは API 23以上のサポートを推奨しており、Android 5.0用のComposeサポートは徐々に縮小している。
なぜ Android 5.0 では Jetpack Compose のサポートが難しいのか?
以下の要因により、Jetpack Compose の新しいバージョンでは Android 5.0 のサポートが難しくなっている:
- コルーチンやFlowの使用:
Jetpack Compose は Kotlin の最新機能(coroutines
、Flow
など)に大きく依存しており、Android 5.0 ではこれらの互換性確保が難しい。 - 内部 API の使用:
Jetpack Compose は、Android 6.0 (API 23) 以降の View/ViewGroup API の最適化を活用する設計になっている。 -
グラフィック処理の最適化:
最新の Compose ではandroidx.graphics
の改善により、新しい GPU アクセラレーション機能が求められる。
解決策: Android 5.0 をサポートしたい場合
もしどうしても Android 5.0 (API 21) をターゲットにしたい場合、以下の代替策がある。
1. Jetpack Compose 1.4 以前を使用する
- Gradle 依存関係のバージョンを調整し、
compose_version
を 1.4.0 にダウングレード:dependencies { implementation "androidx.compose.ui:ui:1.4.0" implementation "androidx.compose.material:material:1.4.0" }
注意点:
- 最新機能が使えない
- セキュリティアップデートが限定的
2. 代替UIフレームワークの検討
- Android 5.0 のサポートを維持したい場合は、従来のXMLベースUI(View System) を活用するのが最も安定した選択肢。
3. マルチモジュール戦略を採用
- Android 6.0 以上で Jetpack Compose を使用し、それ未満のバージョンでは従来の View ベース UI にフォールバックする設計を採用。
- 例えば、
minSdk 21
にして分岐:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // Compose UIの実装 } else { // 従来のXML UI }
- 例えば、
推奨対応(まとめ)
- Android 6.0 (API 23) 以上をサポートする場合:
Jetpack Compose 1.6 以降を採用し、最新の機能を活用。 - Android 5.0 (API 21) もサポートする場合:
Jetpack Compose 1.4 を使う、またはViewベースのUIを併用。 - 長期的なメンテナンスを考慮する場合:
Android 6.0以上をターゲットにし、Composeの最新機能とKotlinの最新バージョンを活用。
全体のまとめ
Androidのバージョン選択は開発者としてというより営業の事情で決定されることが多いだろう。開発者としてはどのバージョンを選べば何が実現できるか(できなくなるか)を知っておかなければならない。
上記の情報を役立てて欲しい。