ソースコードが Java、Kotlin、またはその両方で記述されているかどうかにかかわらず、ビルドに JDK または Java 言語バージョンを選択する必要がある場所がいくつかあります。
用語集
- Java Development Kit(JDK)
-
Java Development Kit(JDK)には、以下が含まれています。
- コンパイラ、プロファイラ、アーカイブ作成ツールなどのツール。 これらは、ビルド中にバックグラウンドで使用され、アプリケーションを作成します。
- Kotlin または Java のソースコードから呼び出すことができる API を含むライブラリ。すべての関数が Android で利用できるわけではありません。
- Java 仮想マシン(JVM)。Java アプリケーションを実行するインタープリタです。JVM を使用して、Android Studio IDE と Gradle ビルドツールを実行します。JVM は Android デバイスやエミュレータでは使用されません。
- JetBrains Runtime(JBR)
- JetBrains Runtime(JBR) は、Android Studio にバンドルされている拡張 JDK です。 Studio や関連する JetBrains 製品で使用するための最適化がいくつか含まれていますが、他の Java アプリケーションの実行にも使用できます。
Android Studio を実行する JDK を選択するにはどうすればよいですか?
Android Studio の実行には JBR を使用することをおすすめします。Android Studio とともにデプロイされ、Android Studio のテストに使用されます。また、Android Studio を最適に使用するための機能強化が含まれています。これを確実にするには、STUDIO_JDK 環境変数を設定しないでください。
Android Studio の起動スクリプトは、次の順序で JVM を検索します。
STUDIO_JDK環境変数studio.jdkディレクトリ(Android Studio ディストリビューション内)- Android Studio ディストリビューションの
jbrディレクトリ(JetBrains ランタイム)。推奨されます。 JDK_HOME環境変数JAVA_HOME環境変数PATH環境変数内のjava実行可能ファイル
Gradle ビルドを実行する JDK を選択するにはどうすればよいですか?
Android Studio のボタンを使用して Gradle を実行すると、Android Studio の設定で設定された JDK が Gradle の実行に使用されます。Android Studio の内部または外部でターミナルから Gradle を実行する場合、JAVA_HOME 環境変数(設定されている場合)によって、Gradle スクリプトを実行する JDK が決まります。JAVA_HOME が設定されていない場合は、PATH 環境変数で java コマンドを使用します。
最も一貫した結果を得るには、JAVA_HOME 環境変数と Android Studio の Gradle JDK 構成を同じ JDK に設定してください。
ビルドを実行すると、Gradle はデーモンと呼ばれるプロセスを作成して実際のビルドを実行します。このプロセスは、ビルドで同じ JDK と Gradle バージョンを使用している限り、再利用できます。デーモンを再利用すると、新しい JVM の起動とビルドシステムの初期化にかかる時間が短縮されます。
異なる JDK または Gradle バージョンでビルドを開始すると、追加のデーモンが作成され、CPU とメモリの消費量が増加します。
Android Studio での Gradle JDK の設定
既存のプロジェクトの Gradle JDK 構成を変更するには、[File](macOS の場合は [Android Studio])> [Settings] > [Build, Execution, Deployment] > [Build Tools] > [Gradle] から Gradle 設定を開きます。[Gradle JDK] プルダウンには、次のオプションがあります。
JAVA_HOMEやGRADLE_LOCAL_JAVA_HOMEなどのマクロ- Android 構成ファイルに保存されている
jbr-17などのvendor-version形式の JDK テーブル エントリ - JDK をダウンロードする
- 特定の JDK を追加する
- オペレーティング システムのデフォルトの JDK インストール ディレクトリからローカルで検出された JDK
選択したオプションは、プロジェクトの .idea/gradle.xml ファイルの gradleJvm オプションに保存され、その JDK パス解決は、Android Studio から起動されたときに Gradle を実行するために使用されます。
これらのマクロを使用すると、プロジェクトの JDK パスを動的に選択できます。
JAVA_HOME: 同じ名前の環境変数を使用します。GRADLE_LOCAL_JAVA_HOME:.gradle/config.propertiesファイルのjava.homeプロパティを使用します。デフォルトは JetBrains Runtime です。
選択した JDK は、Gradle ビルドの実行と、ビルド スクリプトとソースコードの編集時の JDK API リファレンスの解決に使用されます。指定した compileSdk により、ソースコードの編集時とビルド時に使用できる Java シンボルがさらに制限されます。
Gradle ビルドで使用するプラグインで使用されている JDK バージョン以上の JDK バージョンを選択してください。Android Gradle プラグイン(AGP)に必要な JDK の最小バージョンを確認するには、リリースノートの互換性表をご覧ください。
たとえば、Android Gradle プラグイン バージョン 8.x には JDK 17 が必要です。以前のバージョンの JDK で Gradle ビルドを実行しようとすると、次のようなメッセージが表示されます。
An exception occurred applying plugin request [id: 'com.android.application']
> Failed to apply plugin 'com.android.internal.application'.
> Android Gradle plugin requires Java 17 to run. You are currently using Java 11.
Your current JDK is located in /usr/local/buildtools/java/jdk
You can try some of the following options:
- changing the IDE settings.
- changing the JAVA_HOME environment variable.
- changing `org.gradle.java.home` in `gradle.properties`.
Java または Kotlin のソースコードで使用できる Java API はどれですか?
Android アプリは、JDK で定義されている API の一部を使用できますが、すべてを使用できるわけではありません。Android SDK は、利用可能な API の一部として、多くの Java ライブラリ関数の実装を定義しています。compileSdk プロパティは、Kotlin または Java のソースコードをコンパイルするときに使用する Android SDK のバージョンを指定します。
Kotlin
android {
...
compileSdk = 36
}
Groovy
android {
...
compileSdk 36
}
Android の各バージョンは、特定のバージョンの JDK と、利用可能な Java API のサブセットをサポートしています。指定された minSdk では利用できない compileSdk で利用可能な Java API を使用する場合、脱糖と呼ばれるプロセスを通じて、以前のバージョンの Android で API を使用できる場合があります。サポートされている API については、脱糖で使用可能な Java 11+ API をご覧ください。
次の表は、各 Android API でサポートされている Java バージョンと、使用可能な Java API の詳細を確認できる場所を示しています。
| Android | Java | サポートされている API と言語機能 |
|---|---|---|
| 14(API 34) | 17 | コアライブラリ |
| 13(API 33) | 11 | コアライブラリ |
| 12(API 32) | 11 | Java API |
| 11 以前 | Android のバージョン |
Java ソースコードをコンパイルする JDK
Java ツールチェーン JDK には、Java ソースコードのコンパイルに使用される Java コンパイラが含まれています。この JDK は、ビルド中に javadoc と単体テストも実行します。
ツールチェーンのデフォルトは、Gradle の実行に使用される JDK です。デフォルトを使用して、異なるマシン(ローカルマシンと別の継続的インテグレーション サーバーなど)でビルドを実行すると、異なる JDK バージョンが使用されている場合にビルドの結果が異なる可能性があります。
より一貫性のあるビルドを作成するには、Java ツールチェーンのバージョンを明示的に指定します。これを指定すると、次のようになります。
- ビルドを実行しているシステムで互換性のある JDK を見つけます。
- 互換性のある JDK が存在しない場合(かつ、ツールチェーン リゾルバが定義されている場合)は、ダウンロードします。
- ソースコードからの呼び出し用にツールチェーン Java API を公開します。
- Java 言語バージョンを使用して Java ソースをコンパイルします。
sourceCompatibilityとtargetCompatibilityのデフォルトを指定します。
常に Java ツールチェーンを指定し、指定した JDK がインストールされていることを確認するか、ビルドにツールチェーン リゾルバを追加することをおすすめします。
ソースコードが Java、Kotlin、またはその両方で記述されているかどうかにかかわらず、ツールチェーンを指定できます。モジュールの build.gradle(.kts) ファイルの最上位でツールチェーンを指定します。
Java ツールチェーンのバージョンを次のように指定します。
Kotlin
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
Groovy
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
これは、ソースが Kotlin、Java、またはその両方の組み合わせである場合に機能します。
ツールチェーンの JDK バージョンは、Gradle の実行に使用される JDK と同じでもかまいませんが、目的が異なることに注意してください。
Java ソースコードで使用できる Java 言語のソース機能は何ですか?
sourceCompatibility プロパティは、Java ソースのコンパイル時に使用できる Java 言語機能を決定します。Kotlin ソースには影響しません。
モジュールの build.gradle(.kts) ファイルで、次のように sourceCompatibility を指定します。
Kotlin
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
}
}
Groovy
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
}
}
指定しない場合、このプロパティはデフォルトで Java ツールチェーンのバージョンになります。Java ツールチェーンを使用していない場合は、デフォルトで Android Gradle プラグインによって選択されたバージョン(Java 8 以降など)が使用されます。
Kotlin または Java のソースをコンパイルするときに、どの Java バイナリ機能を使用できますか?
targetCompatibility プロパティは、コンパイルされた Java ソースと Kotlin ソースのバイトコードを生成するときに使用される Java クラス形式のバージョンをそれぞれ決定します。
一部の Kotlin 機能は、同等の Java 機能が追加される前から存在していました。初期の Kotlin コンパイラは、これらの Kotlin 機能を表現する独自の方法を作成する必要がありました。これらの機能の一部は、後に Java に追加されました。targetCompatibility レベルがそれより高い場合、Kotlin コンパイラは Java 機能を直接使用することがあり、パフォーマンスが向上する可能性があります。
Android のバージョンによって、サポートされる Java のバージョンが異なります。targetCompatibility を増やすことで、追加の Java 機能を利用できますが、その機能を使用できるようにするには、Android SDK の最小バージョンも増やす必要があります。
targetCompatibility は sourceCompatibility 以上にする必要があります。実際には、sourceCompatibility と targetCompatibility は通常、同じ値を使用する必要があります。次のように設定できます。
Kotlin
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
}
Groovy
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
}
2.2 より前のバージョンの Kotlin を使用している場合は、kotlinOptions も設定する必要があります。
Kotlin
android {
kotlinOptions {
jvmTarget = "17"
}
}
Groovy
android {
kotlinOptions {
jvmTarget = "17"
}
}
指定しない場合、これらのプロパティはデフォルトで Java ツールチェーンのバージョンになります。Java ツールチェーンを使用していない場合、デフォルト値が異なり、ビルドの問題が発生する可能性があります。そのため、これらの値を常に明示的に指定するか、Java ツールチェーンを使用することをおすすめします。