
java.time.LocalDate 사용)desugar_jdk_libs)의 구현으로 변경. 필요 시 해당 라이브러리 클래스를 앱에 자동으로 포함즉, desugaring은 컴파일 후 또는 dex 변환 시에 일어나며, D8/R8이 주요 역할을 담당
sourceCompatibility / targetCompatibility)에 따라 기능과 빌드 속도가 다름Java 8 언어 기능을 사용하려면 다음 단계를 따르세요.
build.gradle 또는 build.gradle.kts 파일을 업데이트//build.gradle.kts
android {
...
// Java 8 언어 기능을
// 사용하는 모듈에 대해서만 설정
// (직접 작성한 코드나 의존 라이브러리 코드 중 어느 쪽이든)
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
// For Kotlin projects
kotlinOptions {
jvmTarget = "1.8"
}
}
//build.gradle
android {
...
// Java 8 언어 기능을
// 사용하는 모듈에 대해서만 설정
// (직접 작성한 코드나 의존 라이브러리 코드 중 어느 쪽이든)
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
// For Kotlin projects
kotlinOptions {
jvmTarget = "1.8"
}
}
| Java 8 언어 기능 | 참고 |
|---|---|
| 람다 표현식 | Android는 람다 표현식의 직렬화를 지원 불가 |
| 메서드 참조 | - |
| Type Annotation | Type Annotation 정보는 런타임이 아닌 컴파일 시간에만 확인 가능. API 수준 24 이하에서 TYPE은 지원, ElementType.TYPE_USE 또는 ElementType.TYPE_PARAMETER는 지원 불가 |
| 기본 및 정적 인터페이스 메서드 | - |
| Annotation 중복 선언 | - |
🛑🛑🛑
사용할 수 있는 자바 8+ API: https://developer.android.com/studio/write/java8-support-table?hl=ko
MethodHandle.invoke 또는 MethodHandle.invokeExact 지원 불가. 해당 메소드들은 자바 리플렉션의 고급 형태로, java.lang.invoke.MethodHandle 클래스에서 제공. 메서드 직접 호출용 API.minSdkVersion 26 이상 지정 필요. 그러지 않으면 다음 오류가 발생Dex: Error converting bytecode to dex:
Cause: signature-polymorphic method called without --min-sdk-version >= 26
invoke 또는 invokeExact 메서드 포함. minSdkVersion 25 이하 버전에서 해당 메서드를 사용하지 않아도 존재 자체만으로 문제 발생앱의 최소 API 수준 제한 없이, 다양한 Java 8 언어 API를 사용할 수 있도록 지원
Java 언어 API도 desugaring 되도록 desugaring 엔진을 확장. java.util.streams 같이 최신 Android에서만 사용 가능한 표준 언어 API를 이전 Android 버전을 지원하는 앱에서도 포함 가능.
다음 API를 지원
java.util.stream)java.time의 하위 집합java.util.functionjava.util.{Map,Collection,Comparator}에 추가된 사항java.util.Optional, java.util.OptionalInt, java.util.OptionalDouble) 및 일부 새 클래스java.util.concurrent.atomic에 추가된 사항(AtomicInteger, AtomicLong, AtomicReference의 새 메서드)ConcurrentHashMap(Android 5.0 버그 수정 포함)Android Gradle 플러그인 7.4.0 이상을 사용하면, desugar_jdk_libs 2.0.0 이상에서 여러 Java 11 언어 API 사용 가능
java.nio.file 패키지의 하위 집합 같은 추가 Java 11 API가 지원
이전에 지원되지 않는 API의 구현을 포함하는 별도의 DEX 파일을 컴파일하고 이를 앱에 포함
🛑🛑🛑
디슈가링을 통해 사용할 수 있는 Java 11+ API:
https://developer.android.com/studio/write/java11-default-support-table?hl=ko
🛑🛑🛑
- 별도의 DEX 파일로 컴파일된 소스 코드는 desugar_jdk_libs GitHub 저장소에서 확인 가능
- https://github.com/google/desugar_jdk_libs
build.gradle 또는 build.gradle.kts 파일에 다음을 포함//build.gradle.kts
android {
defaultConfig {
// Required when setting minSdkVersion to 20 or lower
multiDexEnabled = true
}
compileOptions {
// Flag to enable support for the new language APIs
// For AGP 4.1+
isCoreLibraryDesugaringEnabled = true
// For AGP 4.0
// coreLibraryDesugaringEnabled = true
// Sets Java compatibility to Java 8
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
}
dependencies {
// For AGP 7.4+
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.3")
// For AGP 7.3
// coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.2.3")
// For AGP 4.0 to 7.2
// coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.1.9")
}
//build.gradle
android {
defaultConfig {
// Required when setting minSdkVersion to 20 or lower
multiDexEnabled true
}
compileOptions {
// Flag to enable support for the new language APIs
coreLibraryDesugaringEnabled true
// Sets Java compatibility to Java 8
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
// For AGP 7.4+
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3'
// For AGP 7.3
// coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.2.3'
// For AGP 4.0 to 7.2
// coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.9'
}
build.gradle 또는 build.gradle.kts 파일에도 위 코드 필요Java 8+ API 라이브러리의 버전과 각 버전을 지원하는 최소 Android Gradle 플러그인 버전입니다.
| 버전 | 최소 Android Gradle 플러그인 버전 |
|---|---|
| 1.1.9 | 4.0.0 |
| 1.2.3 | 7.3.0 |
| 2.0.3 | 7.4.0-alpha10 |
Java 8+ API 라이브러리 버전에 관한 자세한 내용은 desugar_jdk_libs GitHub 저장소의 CHANGELOG.md 파일을 참고하세요.
https://github.com/google/desugar_jdk_libs/blob/master/CHANGELOG.md
Desugaring 대신하여 보완용으로 사용할 수 있는 라이브러리는 다음과 같습니다.
java.time 대체하여 날짜 및 시간에 사용desugar_jdk_libs와 중복되면 충돌 위험 있음. 둘 중 하나만 사용.java.util.stream 대체하여 사용 가능map, filter 등) 흉내 가능java.time/stream 등이 자동 포함되지 않을 수 있어 테스트 환경에서만 오류 발생java.time 등 자체 구현을 포함desugar_jdk_libs와 충돌하여 클래스 중복 오류 발생출처: https://developer.android.com/?hl=ko, Chat GPT