ソースコードが Java、Kotlin、またはその両方で記述されていても、いくつかの場所でビルドの JDK または Java 言語バージョンを選択する必要があります。
用語集
- Java Development Kit(JDK)
-
Java Development Kit(JDK)には以下が含まれています。
- コンパイラ、プロファイラ、アーカイブ作成ツールなどのツール。これらは、ビルド時にアプリケーションを作成するためにバックグラウンドで使用されます。
- Kotlin または Java のソースコードから呼び出せる API を含むライブラリ。Android では使用できない機能もあります。
- Java 仮想マシン(JVM)。Java アプリケーションを実行するインタープリタ。Android Studio IDE と Gradle ビルドツールを実行するには、JVM を使用します。JVM は Android デバイスまたはエミュレータでは使用されません。
- JetBrains ランタイム(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 を実行する場合、Gradle スクリプトを実行する JDK は JAVA_HOME
環境変数(設定されている場合)によって決まります。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 が実行されます。
![](https://developer.android.com/static/images/tools/as-gradle-jdk.png?authuser=9&hl=ja)
このマクロにより、動的なプロジェクト JDK パスの選択が有効になります。
JAVA_HOME
: 同じ名前の環境変数を使用します。GRADLE_LOCAL_JAVA_HOME
:.gradle/config.properties
ファイルのjava.home
プロパティを使用します。このプロパティは、デフォルトで JetBrains ランタイムに設定されます。
選択した JDK を使用して、Gradle ビルドを実行し、ビルド スクリプトとソースコードを編集するときに JDK API リファレンスを解決します。なお、compileSdk
を指定すると、ソースコードを編集およびビルドする際に使用できる Java シンボルがさらに制限されます。
Gradle ビルドで使用するプラグインで使用される JDK バージョン以上の JDK バージョンを選択してください。Android Gradle プラグイン(AGP)に必要な最小 JDK バージョンを確認するには、リリースノートの互換性の表をご覧ください。
たとえば、Android Gradle プラグインのバージョン 8.x では JDK 17 が必要です。それを使用する Gradle ビルドを以前のバージョンの JDK で実行しようとすると、次のようなメッセージが報告されます。
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/jdk11
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 = 33
}
Groovy
android {
...
compileSdk 33
}
Android の各バージョンでは、特定のバージョンの JDK と、その利用可能な Java API のサブセットがサポートされています。指定した minSdk
では使用できない compileSdk
で利用可能な Java API を使用している場合、デスガリングと呼ばれるプロセスにより、以前のバージョンの Android でも API を使用できる場合があります。サポートされている API については、desugar で利用可能な 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 が存在しない場合(かつツールチェーン リゾルバが定義されている)場合は、その 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 ソースには影響しません。
指定しない場合、Gradle の実行に使用される Java ツールチェーンまたは JDK がデフォルトで使用されます。常にツールチェーン(推奨)または sourceCompatibility
を明示的に指定することをおすすめします。
モジュールの build.gradle(.kts)
ファイルで sourceCompatibility
を指定します。
Kotlin
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
}
}
Groovy
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
}
}
Kotlin または Java ソースをコンパイルするときに使用できる Java バイナリ機能はどれですか。
targetCompatibility
と jvmTarget
を指定すると、コンパイルされた Java ソースと Kotlin ソースのバイトコードを生成するときにそれぞれ使用される Java クラス形式バージョンが決まります。
一部の Kotlin 機能は、同等の Java 機能が追加される前に存在していました。
初期の Kotlin コンパイラは、こうした Kotlin 機能を表現する独自の方法を作成する必要がありました。これらの機能の一部は後に Java に追加されました。それ以降の jvmTarget
レベルでは、Kotlin コンパイラが Java 機能を直接使用する可能性があり、パフォーマンスが向上する可能性があります。
targetCompatibility
はデフォルトで sourceCompatibility
と同じ値に設定されますが、指定する場合は sourceCompatibility
以上にする必要があります。
jvmTarget
はデフォルトでツールチェーンのバージョンになります。
Android のバージョンが異なれば、サポートされる Java のバージョンも異なります。targetCompatibility
と jvmTarget
の値を大きくすることで、追加の Java 機能を利用できますが、機能を利用できるようにするには、Android SDK の最小バージョンも増やす必要があります。
Kotlin
android {
compileOptions {
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
}
Groovy
android {
compileOptions {
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget '17'
}
}