소스 코드가 Java, Kotlin 또는 둘 다로 작성되었는지에 관계없이 빌드에 사용할 JDK 또는 Java 언어 버전을 선택해야 하는 여러 위치가 있습니다.
용어집
- Java 개발 키트 (JDK)
-
Java 개발 키트 (JDK)
에는 다음이 포함됩니다.
- 컴파일러, 프로파일러, 보관 파일 생성기와 같은 도구 이러한 도구는 빌드 중에 백그라운드에서 애플리케이션을 만드는 데 사용됩니다.
- Kotlin 또는 Java 소스 코드에서 호출할 수 있는 API가 포함된 라이브러리 Android에서는 일부 함수를 사용할 수 없습니다.
- Java 애플리케이션을 실행하는 인터프리터인 Java 가상 머신 (JVM) JVM을 사용하여 Android 스튜디오 IDE 및 Gradle 빌드 도구를 실행합니다. JVM은 Android 기기 또는 에뮬레이터에서 사용되지 않습니다.
- JetBrains 런타임 (JBR)
- JetBrains 런타임 (JBR) 은 Android 스튜디오와 함께 배포되는 향상된 JDK입니다. 여기에는 스튜디오 및 관련 JetBrains 제품에서 사용하기 위한 여러 최적화가 포함되어 있지만 다른 Java 애플리케이션을 실행하는 데에도 사용할 수 있습니다.
Android 스튜디오를 실행할 JDK를 선택하려면 어떻게 해야 하나요?
JBR을 사용하여 Android 스튜디오를 실행하는 것이 좋습니다. JBR은 Android 스튜디오와 함께 배포되고 Android 스튜디오를 테스트하는 데 사용되며 최적의 Android 스튜디오 사용을 위한 개선사항이 포함되어 있습니다. 이렇게 하려면 STUDIO_JDK 환경 변수를 설정하지 마세요.
Android 스튜디오의 시작 스크립트는 다음 순서로 JVM을 찾습니다.
STUDIO_JDK환경 변수studio.jdk디렉터리 (Android 스튜디오 배포)jbr디렉터리 (JetBrains 런타임), Android 스튜디오 배포 (권장)JDK_HOME환경 변수JAVA_HOME환경 변수PATH환경 변수의java실행 파일
Gradle 빌드를 실행할 JDK를 선택하려면 어떻게 해야 하나요?
Android 스튜디오의 버튼을 사용하여 Gradle을 실행하면 Android 스튜디오 설정에서 설정된 JDK가 Gradle을 실행하는 데 사용됩니다. Android 스튜디오 내부 또는 외부의 터미널에서 Gradle을 실행하면 JAVA_HOME 환경 변수(설정된 경우)가 Gradle 스크립트를 실행하는 JDK를 결정합니다. JAVA_HOME이 설정되지 않은 경우 PATH 환경 변수의 java 명령어를 사용합니다.
가장 일관된 결과를 얻으려면 JAVA_HOME
환경 변수와
Android 스튜디오의 Gradle JDK 구성을 동일한
JDK로 설정해야 합니다.
빌드를 실행할 때 Gradle은 실제 빌드를 실행하기 위해 데몬 이라는 프로세스를 만듭니다. 빌드에서 동일한 JDK 및 Gradle 버전을 사용하는 한 이 프로세스를 재사용할 수 있습니다. 데몬을 재사용하면 새 JVM을 시작하고 빌드 시스템을 초기화하는 데 걸리는 시간이 줄어듭니다.
다른 JDK 또는 Gradle 버전으로 빌드를 시작하면 추가 데몬이 생성되어 더 많은 CPU와 메모리를 사용합니다.
Android 스튜디오의 Gradle JDK 구성
기존 프로젝트의 Gradle JDK 구성을 수정하려면 파일 (또는 macOS의 경우 Android 스튜디오) > 설정 > 빌드, 실행, 배포 > 빌드 도구 > Gradle 에서 Gradle 설정을 엽니다. Gradle JDK 드롭다운에는 선택할 수 있는 다음과 같은 옵션이 포함되어 있습니다.
JAVA_HOME및GRADLE_LOCAL_JAVA_HOME과 같은 매크로- Android 구성 파일에 저장된
vendor-version형식의 JDK 테이블 항목(예:jbr-17) - JDK 다운로드
- 특정 JDK 추가
- 운영체제의 기본 JDK 설치 디렉터리에서 로컬로 감지된 JDK
선택한 옵션은 프로젝트의 .idea/gradle.xml 파일에 있는 gradleJvm 옵션에 저장되며, Android 스튜디오를 통해 시작될 때 Gradle을 실행하는 데 JDK 경로 확인이 사용됩니다.
매크로를 사용하면 동적 프로젝트 JDK 경로를 선택할 수 있습니다.
JAVA_HOME: 동일한 이름의 환경 변수를 사용합니다.GRADLE_LOCAL_JAVA_HOME: 기본적으로 JetBrains 런타임인.gradle/config.properties파일의java.home속성을 사용합니다.
선택한 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에서 사용할 수 없는
a 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 버전 |
어떤 JDK가 Java 소스 코드를 컴파일하나요?
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 소스에는 영향을 미치지 않습니다.
모듈의 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 및 jvmTarget 속성은 각각 컴파일된 Java 및 Kotlin 소스의 바이트 코드를 생성할 때 사용되는 Java 클래스 형식 버전을 결정합니다.
일부 Kotlin 기능은 상응하는 Java 기능이 추가되기 전에 존재했습니다.
초기 Kotlin 컴파일러는 이러한 Kotlin 기능을 나타내는 자체 방법을 만들어야 했습니다. 이러한 기능 중 일부는 나중에 Java에 추가되었습니다.
이후 jvmTarget 수준에서는 Kotlin 컴파일러가 Java 기능을 직접 사용할 수 있으므로 성능이 향상될 수 있습니다.
Android의 여러 버전은 여러 버전의 Java를 지원합니다. 추가 Java 기능을 활용하려면
targetCompatibility 및 jvmTarget을 늘리면 되지만, 기능을 사용할 수 있도록
최소 Android SDK 버전도 늘려야 할 수 있습니다.
targetCompatibility는 sourceCompatibility보다 크거나 같아야 합니다. 실제로 sourceCompatibility, targetCompatibility, jvmTarget은 일반적으로 동일한 값을 사용해야 합니다.
다음과 같이 설정할 수 있습니다.
Kotlin
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
}
Groovy
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget '17'
}
}
지정되지 않은 경우 이 속성은 기본적으로 Java 도구 모음 버전으로 설정됩니다. Java 툴체인을 사용하지 않는 경우 기본값이 다를 수 있으며 빌드 문제가 발생할 수 있습니다. 따라서 항상 이러한 값을 명시적으로 지정하거나 Java 도구 모음을 사용하는 것이 좋습니다.