Android Gradle 플러그인 9.0은 API 및 동작 변경사항을 제공하는 주요 버전입니다.
Android Gradle 플러그인 9.0.1로 업데이트하려면 Android Gradle 플러그인 업그레이드 어시스턴트를 사용하세요. AGP 업그레이드 어시스턴트는 프로젝트를 업그레이드할 때마다 기존 동작을 보존하는 데 도움이 되므로 AGP 9.0의 모든 새로운 기본값을 채택할 준비가 되지 않았더라도 AGP 9.0을 사용하도록 프로젝트를 업그레이드할 수 있습니다.
업그레이드 절차를 더 쉽게 만들어주는 두 가지 상담사 기술도 있습니다. KMP가 아닌 앱의 경우 Android 기술 저장소의 AGP 9 업그레이드 기술을 사용해 보세요. KMP 앱의 경우 JetBrains의 AGP 9 업그레이드 기술을 사용해 보세요. Android 스튜디오에서 기술을 사용하는 방법에 관한 자세한 내용은 기술로 에이전트 모드 확장을 참고하세요.
호환성
Android Gradle 플러그인 9.0에서 지원하는 최대 API 수준은 API 수준 36.1입니다. 기타 호환성 정보는 다음과 같습니다.
| 최소 버전 | 기본 버전 | 참고 | |
|---|---|---|---|
| Gradle | 9.1.0 | 9.1.0 | 자세한 내용은 Gradle 업데이트하기를 참고하세요. |
| SDK 빌드 도구 | 36.0.0 | 36.0.0 | SDK 빌드 도구를 설치 또는 구성합니다. |
| NDK | 해당 사항 없음 | 28.2.13676358 | 다른 버전의 NDK를 설치 또는 구성합니다. |
| JDK | 17 | 17 | 자세한 내용은 JDK 버전 설정을 참고하세요. |
| Kotlin Gradle 플러그인 (KGP) | 2.2.10 | 2.2.10 | 자세한 내용은 Kotlin Gradle 플러그인의 런타임 종속 항목을 참고하세요. |
이제 android DSL 클래스는 새 공개 인터페이스만 구현합니다.
지난 몇 년 동안 Google은 공개 API를 더 효과적으로 제어하기 위해 DSL 및 API에 새로운 인터페이스를 도입했습니다. AGP 버전 7.x 및 8.x는 인터페이스 작업이 진행되는 동안 호환성을 유지하기 위해 여전히 이전 DSL 유형 (예: BaseExtension)을 사용했으며, 이 유형은 새로운 공개 인터페이스도 구현했습니다.
AGP 9.0은 새로운 DSL 인터페이스만 사용하며, 구현은 완전히 숨겨진 새로운 유형으로 변경되었습니다. 이렇게 하면 지원 중단된 이전 변형 API에 대한 액세스 권한도 삭제됩니다.
AGP 9.0으로 업데이트하려면 다음을 실행해야 할 수 있습니다.
- 프로젝트가 내장 Kotlin과 호환되는지 확인:
org.jetbrains.kotlin.android플러그인은 새 DSL과 호환되지 않습니다. KMP 프로젝트를 KMP용 Android Gradle 라이브러리 플러그인으로 전환:
com.android.library및com.android.application플러그인과 동일한 Gradle 하위 프로젝트에서org.jetbrains.kotlin.multiplatform플러그인을 사용하는 것은 새 DSL과 호환되지 않습니다.빌드 파일 업데이트: 인터페이스 변경은 DSL을 최대한 유사하게 유지하기 위한 것이지만 몇 가지 작은 변경사항이 있을 수 있습니다.
새 DSL 및 API를 참조하도록 커스텀 빌드 로직 업데이트: 내부 DSL에 대한 참조를 공개 DSL 인터페이스로 바꿉니다. 대부분의 경우 일대일 교체가 이루어집니다.
applicationVariants및 유사한 API의 사용을 새로운androidComponentsAPI로 대체합니다.androidComponentsAPI는 플러그인 호환성을 더 오래 유지하기 위해 더 안정적으로 설계되었으므로 이 작업은 더 복잡할 수 있습니다. 예시는 Gradle 레시피를 참고하세요.서드 파티 플러그인 업데이트: 일부 서드 파티 플러그인은 더 이상 노출되지 않는 인터페이스나 API에 계속 종속될 수 있습니다. AGP 9.0과 호환되는 플러그인 버전으로 이전합니다.
새 DSL 인터페이스로 전환하면 플러그인과 Gradle 빌드 스크립트가 다음과 같은 다양한 지원 중단된 API를 사용하지 못하게 됩니다.
android 블록의 지원 중단된 API |
함수 | 대체 |
|---|---|---|
applicationVariants,libraryVariants,testVariants, unitTestVariants
|
플러그인이 AGP에 새 기능을 추가할 수 있는 확장점입니다. |
androidComponents.onVariants API로 바꿉니다. 예를 들면 다음과 같습니다.
androidComponents { onVariants() { variant -> variant.signingConfig .enableV1Signing.set(false) } } |
variantFilter
|
선택한 대안을 사용 중지할 수 있습니다. |
androidComponents.beforeVariants API로 바꿉니다. 예를 들면 다음과 같습니다.
androidComponents { beforeVariants( selector() .withBuildType("debug") .withFlavor("color", "blue") ) { variantBuilder -> variantBuilder.enable = false } } |
deviceProvider 및testServer
|
Android 기기 및 에뮬레이터에서 테스트를 실행하기 위한 맞춤 테스트 환경 등록 | Gradle 관리 기기로 전환합니다. |
sdkDirectory,ndkDirectory,bootClasspath,adbExecutable, adbExe
|
맞춤 작업을 위해 Android SDK의 다양한 구성요소 사용 |
androidComponents.sdkComponents로 전환합니다.
|
registerArtifactType,registerBuildTypeSourceProvider,registerProductFlavorSourceProvider,registerJavaArtifact,registerMultiFlavorSourceProvider, wrapJavaSourceSet |
Android 스튜디오에서 생성된 소스 처리와 주로 관련된 오래된 기능으로, AGP 7.2.0에서 작동이 중지되었습니다. | 이러한 API를 직접 대체할 수 있는 API는 없습니다. |
dexOptions
|
dx 도구와 관련된 오래된 설정으로, d8로 대체되었습니다. Android Gradle 플러그인 7.0 이후로는 어떤 설정도 영향을 미치지 않습니다.
|
직접 대체할 수 있는 방법은 없습니다. |
generatePureSplits
|
인스턴트 앱의 구성 분할을 생성합니다. | 이제 구성 분할을 제공하는 기능이 Android App Bundle에 내장되어 있습니다. |
aidlPackagedList
|
이 라이브러리에 종속된 라이브러리 및 앱의 API로 노출하기 위해 AAR에 패키징할 AIDL 파일입니다. |
이는 LibraryExtension에는 계속 노출되지만 다른 확장 프로그램 유형에는 노출되지 않습니다.
|
AGP 9.0으로 업데이트하고 다음 오류 메시지가 표시되면 프로젝트가 여전히 이전 유형 중 일부를 참조하고 있는 것입니다.
java.lang.ClassCastException: class com.android.build.gradle.internal.dsl.ApplicationExtensionImpl$AgpDecorated_Decorated
cannot be cast to class com.android.build.gradle.BaseExtension
호환되지 않는 서드 파티 플러그인으로 인해 차단된 경우 선택 해제하고 DSL의 이전 구현과 이전 변형 API를 다시 가져올 수 있습니다.
이 작업을 수행하는 동안 새 인터페이스도 사용할 수 있으며 자체 빌드 로직을 새 API로 업데이트할 수 있습니다. 선택 해제하려면 gradle.properties 파일에 다음 줄을 포함합니다.
android.newDsl=false
또는 더 점진적인 이전을 위해 AGP 9.4를 사용하면 개별 모듈을 선택 해제할 수 있습니다. 자세한 내용은 Variant API 모듈 선택 해제를 참고하세요.
이전 클래스는 AGP 9.0에서 지원 중단된 것으로 표시됩니다. 즉, newDsl 플래그를 선택 해제하는 프로젝트에는 android 블록 자체를 포함한 지원 중단 경고가 표시됩니다.
AGP 9.0으로 업그레이드하기 전에 새 API로 업그레이드를 시작할 수도 있습니다. 새 인터페이스는 여러 AGP 버전에 존재하므로 새 인터페이스와 이전 인터페이스를 혼합할 수 있습니다. AGP API 참조 문서에는 각 AGP 버전의 API 노출 영역과 각 클래스, 메서드, 필드가 추가된 시점이 나와 있습니다.
Google은 일반적으로 사용되는 플러그인의 작성자에게 연락하여 새 모드와 완전히 호환되는 플러그인을 조정하고 출시할 수 있도록 지원하고 있으며, Android 스튜디오의 AGP 업그레이드 어시스턴트를 지속적으로 개선하여 이전 과정을 안내할 예정입니다.
새 DSL 또는 Variant API에 기능이 누락된 경우 가능한 한 빨리 문제를 신고하세요.
기본 제공 Kotlin
Android Gradle 플러그인 9.0에는 기본 제공 Kotlin 지원이 도입되었으며 기본적으로 사용 설정됩니다. 즉, Kotlin 소스 파일을 컴파일하기 위해 빌드 파일에 org.jetbrains.kotlin.android (또는 kotlin-android) 플러그인을 더 이상 적용할 필요가 없습니다.
이렇게 하면 AGP와의 Kotlin 통합이 간소화되고, 지원 중단된 API의 사용을 방지하며, 경우에 따라 성능이 개선됩니다.
따라서 프로젝트를 AGP 9.0으로 업그레이드할 때는 내장 Kotlin으로 이전하거나 선택 해제해야 합니다.
Kotlin 소스가 없는 Gradle 하위 프로젝트에 대해 기본 제공 Kotlin 지원을 선택적으로 사용 중지할 수도 있습니다.
Kotlin Gradle 플러그인에 대한 런타임 종속 항목
내장 Kotlin 지원을 제공하기 위해 이제 Android Gradle 플러그인 9.0에는 Kotlin Gradle 플러그인 (KGP) 2.2.10에 대한 런타임 종속 항목이 있습니다. 즉, 더 이상 KGP 버전을 선언할 필요가 없으며 2.2.10보다 낮은 KGP 버전을 사용하는 경우 Gradle이 KGP 버전을 2.2.10으로 자동 업그레이드합니다. 마찬가지로 2.2.10-2.0.2보다 낮은 KSP 버전을 사용하는 경우 AGP는 KGP 버전과 일치하도록 2.2.10-2.0.2로 업그레이드합니다.
더 높은 KGP 버전으로 업그레이드
상위 버전의 KGP 또는 KSP를 사용하려면 최상위 빌드 파일에 다음을 추가합니다.
buildscript {
dependencies {
// For KGP
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:KGP_VERSION")
// For KSP
classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin:KSP_VERSION")
}
}
하위 KGP 버전으로 다운그레이드
기본 제공 Kotlin을 선택 해제한 경우에만 KGP 버전을 다운그레이드할 수 있습니다. AGP 9.0은 기본적으로 기본 제공 Kotlin을 사용 설정하고 기본 제공 Kotlin에는 KGP 2.2.10 이상이 필요하기 때문입니다.
이전 버전의 KGP 또는 KSP를 사용하려면 엄격한 버전 선언을 사용하여 최상위 빌드 파일에서 해당 버전을 선언합니다.
buildscript {
dependencies {
// For KGP
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") {
version { strictly("KGP_VERSION") }
}
// For KSP
classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin") {
version { strictly("KSP_VERSION") }
}
}
}
다운그레이드할 수 있는 최소 KGP 버전은 2.0.0입니다.
테스트 픽스처에 대한 IDE 지원
AGP 9.0은 테스트 픽스처에 대한 완전한 Android 스튜디오 IDE 지원을 제공합니다.
Fused Library 플러그인
융합 라이브러리 플러그인 (프리뷰)을 사용하면 여러 라이브러리를 단일 Android 라이브러리 AAR로 게시할 수 있습니다. 이렇게 하면 사용자가 게시된 아티팩트를 더 쉽게 사용할 수 있습니다.
시작하는 방법에 관한 자세한 내용은 융합 라이브러리를 사용하여 여러 Android 라이브러리를 하나로 게시를 참고하세요.
동작 변경사항
Android Gradle 플러그인 9.0에는 다음과 같은 새로운 동작이 있습니다.
| 동작 | 추천 |
|---|---|
Android Gradle 플러그인 9.0은 기본적으로 NDK 버전 r28c을 사용합니다.
|
사용할 NDK 버전을 명시적으로 지정하는 것이 좋습니다. |
| Android Gradle 플러그인 9.0은 기본적으로 라이브러리 소비자가 동일하거나 더 높은 컴파일 SDK 버전을 사용하도록 요구합니다. |
라이브러리를 사용할 때 동일하거나 더 높은 컴파일 SDK를 사용하세요.
이것이 불가능하거나 게시하는 라이브러리의 소비자에게 전환할 시간을 더 주고 싶다면 AarMetadata.minCompileSdk를 명시적으로 설정하세요.
|
AGP 9.0에는 다음 Gradle 속성의 기본값 업데이트가 포함되어 있습니다. 이렇게 하면 업그레이드 시 AGP 8.13 동작을 유지할 수 있습니다.
| 속성 | 함수 | AGP 8.13에서 AGP 9.0으로 변경 | 추천 |
|---|---|---|---|
android. |
android 블록의 기존 구현을 노출하지 않고 새 DSL 인터페이스를 사용합니다.즉, android.applicationVariants와 같은 기존 변형 API에 더 이상 액세스할 수 없습니다.
|
false → true |
android.newDsl=false를 설정하여 선택 해제할 수 있습니다.프로젝트에서 사용하는 모든 플러그인과 빌드 로직이 호환되면 선택 해제를 삭제합니다. |
android. |
기본 제공 Kotlin을 사용 설정합니다. | false → true |
가능한 경우 기본 제공 Kotlin으로 이전하거나 선택 해제합니다. |
android. |
각 라이브러리에 고유한 패키지 이름이 있어야 합니다. | false → true |
프로젝트 내의 모든 라이브러리에 고유한 패키지 이름을 지정합니다. 이것이 불가능한 경우 마이그레이션하는 동안 이 플래그를 사용 중지할 수 있습니다. |
android. |
기본적으로 androidx 종속 항목을 사용합니다.
|
false → true |
androidx 종속 항목을 채택합니다.
|
android. |
androidx.test.runner.AndroidJUnitRunner 클래스를 사용하여 기본적으로 기기 내 테스트를 실행합니다. 지원 중단된 InstrumentationTestRunner의 기본값은
android {
defaultConfig {
testInstrumentationRunner = "..."
}
} |
false → true |
AndroidJUnitRunner를 채택하거나 맞춤 testInstrumentationRunner를 명시적으로 지정합니다.
|
android. |
구성 간 종속 항목 제약 조건 사용을 제어합니다. AGP 9.0의 기본값은 false이며, 애플리케이션 기기 테스트 (AndroidTest)에서만 제약 조건을 사용합니다.
이 값을 true로 설정하면 8.13 동작으로 되돌아갑니다.
|
true → false |
필요하지 않은 경우 모든 곳에서 종속 항목 제약조건을 사용하지 마세요. 이 플래그의 새 기본값을 수락하면 프로젝트 가져오기 프로세스에서 최적화가 사용 설정되어 Android 라이브러리 하위 프로젝트가 많은 빌드의 가져오기 시간이 단축됩니다. |
android. |
애플리케이션의 코드를 최종이 아닌 R 클래스에 대해 컴파일하여 애플리케이션 컴파일을 라이브러리 컴파일과 일치시킵니다. 이렇게 하면 증분성이 개선되고 향후 리소스 처리 흐름의 성능 최적화를 위한 기반이 마련됩니다. |
false → true |
많은 프로젝트에서 소스 변경 없이 새 동작을 채택할 수 있습니다. R 클래스 필드가 switch 문과 같이 상수가 필요한 곳에 사용되는 경우 연결된 if 문을 사용하도록 리팩터링합니다. |
android. |
컴파일 SDK 버전을 앱 및 테스트의 타겟 SDK 버전의 기본값으로 사용합니다. 이 변경사항이 적용되기 전에는 타겟 SDK 버전이 기본적으로 최소 SDK 버전으로 설정되었습니다. |
false → true |
앱과 테스트의 타겟 SDK 버전을 명시적으로 지정합니다. |
android. |
테스트된 빌드 유형의 단위 테스트 구성요소만 만듭니다. 기본 프로젝트에서 이로 인해 디버그를 위한 단일 단위 테스트가 발생합니다. 이전 동작은 디버그 또는 출시를 위해 단위 테스트를 실행하는 것이었습니다. |
false → true |
프로젝트에서 디버그와 출시 모두에 대해 테스트를 실행할 필요가 없는 경우 변경할 필요가 없습니다. |
android. |
AGP DSL에 지정된 유지 파일이 디스크에 없으면 오류와 함께 빌드가 실패합니다. 이 변경사항이 적용되기 전에는 파일 이름에 오타가 있으면 파일이 자동으로 무시되었습니다. | false → true |
잘못된 proguard 파일 선언 삭제 |
android. |
클래스와 Android 리소스를 함께 고려하여 R8이 더 적은 Android 리소스를 유지할 수 있습니다. | false → true |
프로젝트의 보관 규칙이 이미 완료된 경우 변경할 필요가 없습니다. |
android. |
클래스가 유지될 때 기본 생성자를 암시적으로 유지하지 않음으로써 R8이 더 적게 유지할 수 있습니다.
즉, -keep class A는 더 이상 -keep class A { <init>(); }를 의미하지 않습니다. |
false → true |
프로젝트의 보관 규칙이 이미 완료된 경우 변경할 필요가 없습니다.
기본 생성자를 유지해야 하는 경우 프로젝트의 유지 규칙에서 -keep class A를 -keep class A { <init>(); }로 바꿉니다.
|
android. |
모든 하위 프로젝트에서 resValues를 사용 설정합니다.
|
true → false |
필요한 하위 프로젝트의 Gradle 빌드 파일에 다음을 설정하여 해당 하위 프로젝트에서만 resValues를 사용 설정합니다.
android {
buildFeatures {
resValues = true
}
} |
android. |
모든 하위 프로젝트에서 셰이더 컴파일을 사용 설정합니다. | true → false |
컴파일할 셰이더가 포함된 하위 프로젝트에서만 셰이더 컴파일을 사용 설정하려면 해당 프로젝트의 Gradle 빌드 파일에서 다음을 설정합니다.
android {
buildFeatures {
shaders = true
}
} |
android. |
AGP 9.0에서 getDefaultProguardFile()는 proguard-android.txt가 아닌 proguard-android-optimize.txt만 지원합니다. 이는 proguard-android.txt에 포함된 dontoptimize 플래그가 실수로 사용되는 것을 방지하기 위한 것입니다.
|
false → true |
최적화를 피하려면 proguard-android-optimize.txt를 사용하는 것과 함께 커스텀 proguardFile에 dontoptimize를 명시적으로 지정하면 됩니다. dontoptimize 플래그는 R8 최적화 이점을 줄이므로 가능하면 이 파일에서 삭제해야 합니다. 그렇지 않은 경우 android.r8.globalOptionsInConsumerRules.disallowed=false를 설정하여 선택 해제합니다.
|
android. |
AGP 9.0부터는 소비자 유지 파일에 문제가 있는 Proguard 구성이 포함된 경우 Android 라이브러리 및 기능 모듈 게시가 실패합니다. dontoptimize 또는 dontobfuscate와 같은 전역 옵션이 포함된 소비자 유지 파일은 애플리케이션 모듈에서만 사용해야 하며 라이브러리 사용자의 최적화 이점을 줄일 수 있습니다. Android 앱 모듈 컴파일은 사전 컴파일된 종속 항목 (JAR 또는 AAR)에 삽입된 경우 이러한 전역 옵션을 자동으로 무시합니다. configuration.txt (일반적으로 <app_module>/build/outputs/mapping/<build_variant>/configuration.txt과 같은 경로에 있음)에서 다음과 같은 주석을 확인하여 이 문제가 발생하는 시점을 확인할 수 있습니다. # REMOVED CONSUMER RULE: dontoptimize
|
false → true |
게시된 라이브러리에서 호환되지 않는 규칙을 삭제해야 합니다. 내부 라이브러리는 호환되지 않지만 필요한 규칙을 앱 모듈의 proguardFile로 이동해야 합니다. android.r8.globalOptionsInConsumerRules.disallowed=false을 설정하여 선택 해제합니다. 모든 일반 사용자 Keep 파일이 호환되면 선택 해제를 삭제합니다.
|
android. |
AndroidSourceSet DSL을 사용하여 생성된 소스에 제공자를 전달하는 것을 허용하지 않습니다.
|
false → true |
androidComponents에서 Sources API를 사용하여 생성된 소스를 등록합니다.
|
android. |
셰이더 컴파일이 사용 설정된 경우 셰이더 컴파일러 경로를 local.properties에 명시적으로 설정해야 합니다.
|
false → true |
프로젝트의 local.properties에 glslc.dir=/path/to/shader-tools를 추가합니다.
|
삭제된 기능
Android Gradle 플러그인 9.0에서는 다음 기능이 삭제됩니다.
- 삽입된 Wear OS 앱 지원
AGP 9.0에서는 Wear OS 앱 삽입 지원이 삭제되며, 이는 Play에서 더 이상 지원되지 않습니다. 여기에는wearApp구성과AndroidSourceSet.wearAppConfigurationNameDSL 삭제가 포함됩니다. Wear OS에 앱을 게시하는 방법은 Wear OS에 배포를 참고하세요. androidDependencies및sourceSets보고서 작업- 밀도 분할 APK 지원
AGP 9.0에서는 화면 밀도를 기반으로 분할 APK를 만드는 기능이 삭제됩니다. 기능 및 관련 API가 삭제되었습니다. AGP 9.0 이상을 사용하여 화면 밀도에 따라 분할 APK를 분할하려면 App Bundle을 사용하세요.
변경된 DSL
Android Gradle 플러그인 9.0에는 다음과 같은 브레이킹 DSL 변경사항이 있습니다.
CommonExtension의 매개변수화가 삭제되었습니다.그 자체로는 향후 소스 수준 브레이킹 체인지를 방지하는 데 도움이 되는 소스 수준 브레이킹 체인지일 뿐이지만, 블록 메서드를
CommonExtension에서ApplicationExtension,LibraryExtension,DynamicFeatureExtension,TestExtension로 이동해야 한다는 의미이기도 합니다.프로젝트를 AGP 9.0으로 업그레이드할 때 이러한 매개변수 또는 블록 메서드를 사용하는 Gradle 플러그인 코드를 리팩터링합니다. 예를 들어 다음 플러그인은 유형 매개변수를 삭제하고 삭제된 블록 메서드를 사용하지 않도록 업데이트됩니다.
AGP 8.13
val commonExtension: CommonExtension<*, *, *, *, *, *> = extensions.getByType(CommonExtension::class) commonExtension.apply { defaultConfig { minSdk { version = release(28) } } }AGP 9.0
val commonExtension: CommonExtension = extensions.getByType(CommonExtension::class) commonExtension.apply { defaultConfig.apply { minSdk { version = release(28) } } }다양한 AGP 버전을 타겟팅하는 플러그인의 경우 getter를 직접 사용하면 AGP 버전 9.0 미만과 바이너리 호환됩니다.
삭제된 DSL
Android Gradle 플러그인 9.0에서 삭제되는 항목은 다음과 같습니다.
AndroidSourceSet.jni: 작동하지 않았기 때문입니다.AndroidSourceSet.wearAppConfigurationName: 삭제된 내장 Wear OS 앱 지원과 관련이 있습니다.BuildType.isRenderscriptDebuggable: 작동하지 않았기 때문입니다.DependencyVariantSelection.DependencySelection로 대체되며, 이는kotlin.android.localDependencySelection로 노출됩니다.Installation.installOptions(String).Installation.installOptions의 변경 가능한 속성으로 대체됩니다.실험용이지만 안정화되지 않은
PostProcessing블록입니다.ProductFlavor.setDimension:dimension속성으로 대체됨LanguageSplitOptions: 지원 중단된 Google Play 인스턴트에만 유용했습니다.DensitySplit: 이 기능은 더 이상 지원되지 않습니다. 대체 방법은 App Bundle을 사용하는 것입니다.
삭제된 API
Android Gradle 플러그인 9.0에서 삭제되는 항목은 다음과 같습니다.
Component.transformClassesWith.Instrumentation.transformClassesWith로 대체됩니다.Component.setAsmFramesComputationMode.Instrumentation.setAsmFramesComputationMode로 대체됩니다.DependenciesInfoBuilder.includedInBundle.includeInBundle로 대체됩니다.GeneratesApk.targetSdkVersion.targetSdk로 대체됩니다.Variant.minSdkVersion.minSdk로 대체됩니다.Variant.maxSdkVersion.maxSdk로 대체됩니다.Variant.targetSdkVersion.targetSdk로 대체됩니다.Variant.unitTest:com.android.test플러그인에 적용되지 않으므로 삭제되었습니다.unitTest는HasUnitTest를 확장하는VariantBuilder하위 유형에서 사용할 수 있습니다.VariantBuilder.targetSdk및targetSdkPreview는 라이브러리에서 의미가 없으므로 삭제했습니다. 대신GeneratesApkBuilder.targetSdk또는GeneratesApkBuilder.targetSdkPreview를 사용합니다.VariantBuilder.enableUnitTest:com.android.test플러그인에 적용되지 않으므로 삭제되었습니다.enableUnitTest는HasUnitTestBuilder를 확장하는VariantBuilder하위 유형에서 사용할 수 있습니다.VariantBuilder.unitTestEnabled는HasUnitTestBuilder를 확장하는VariantBuilder하위 유형에서 더 일관되게 이름이 지정된enableUnitTest를 위해 삭제되었습니다.VariantOutput.enable.enabled로 대체됩니다.FeaturePlugin및FeatureExtension가 지원 중단되고 사용 중지되었습니다.지원 중단되고 사용 중지된
BaseExtension.registerTransformAPI는 AGP 4.2 이하에서 실행을 타겟팅하면서 최신 AGP 버전을 기준으로 컴파일할 수 있도록 하기 위해서만 남아 있었습니다.
삭제된 Gradle 속성
다음 Gradle 속성은 기본적으로 사용 설정된 기능을 전역적으로 사용 중지하는 방법으로 처음 추가되었습니다.
이러한 기능은 AGP 8.0 이하부터 기본적으로 사용 중지되었습니다. 더 효율적인 빌드를 위해 이러한 기능을 사용하는 하위 프로젝트에서만 사용 설정하세요.
| 속성 | 함수 | 대체 |
|---|---|---|
android. |
모든 하위 프로젝트에서 AIDL 컴파일을 사용 설정합니다. |
AIDL 소스가 있는 하위 프로젝트에서만 AIDL 컴파일을 사용 설정하려면 해당 프로젝트의 Gradle 빌드 파일에서 다음 속성을 설정합니다.
AIDL 소스가 포함된 각 하위 프로젝트의 Gradle 빌드 파일에 있는 android {
buildFeatures {
aidl = true
}
} |
android. |
모든 하위 프로젝트에서 RenderScript 컴파일 을 사용 설정합니다. |
다음 속성을 프로젝트의 Gradle 빌드 파일에 설정하여 renderscript 소스가 있는 하위 프로젝트에서만 renderscript 컴파일을 사용 설정합니다.
android {
buildFeatures {
renderScript = true
}
} |
강제 적용된 Gradle 속성
다음 Gradle 속성을 설정하면 AGP 9.0에서 오류가 발생합니다.
Android Gradle 플러그인 업그레이드 어시스턴트는 이러한 속성을 사용하는 프로젝트를 AGP 9.0으로 업그레이드하지 않습니다.
| 속성 | 함수 |
|---|---|
android. |
이제 리소스 축소가 항상 R8의 일부로 실행되며 이전 구현은 삭제되었습니다. |
android. |
이제 리소스 축소는 항상 정확한 리소스 축소를 사용하므로 더 많은 리소스를 삭제할 수 있습니다. |
R8 변경사항
AGP 9.0.0에는 다음과 같은 R8 변경사항이 포함되어 있습니다.
새 구성 옵션 -processkotlinnullchecks
Kotlin null 검사를 처리하기 위해 R8을 구성하는 새로운 R8 옵션 -processkotlinnullchecks이 추가되었습니다. 이 옵션은 keep, remove_message, remove의 세 가지 값 중 하나여야 하는 필수 인수를 사용합니다.
이 옵션은 Kotlin 컴파일러에서 추가한 다음 null 검사를 처리합니다.
class kotlin.jvm.internal.Intrinsics {
void checkNotNull(java.lang.Object);
void checkNotNull(java.lang.Object, java.lang.String);
void checkExpressionValueIsNotNull(
java.lang.Object, java.lang.String);
void checkNotNullExpressionValue(
java.lang.Object, java.lang.String);
void checkReturnedValueIsNotNull(
java.lang.Object, java.lang.String);
void checkReturnedValueIsNotNull(
java.lang.Object, java.lang.String, java.lang.String);
void checkFieldIsNotNull(java.lang.Object, java.lang.String);
void checkFieldIsNotNull(
java.lang.Object, java.lang.String, java.lang.String);
void checkParameterIsNotNull(java.lang.Object, java.lang.String);
void checkNotNullParameter(java.lang.Object, java.lang.String);
}
가장 약한 것부터 가장 강한 것까지 순서대로 정렬된 옵션 값은 다음과 같은 효과를 가집니다.
keep는 검사를 변경하지 않습니다.remove_message는 각 검사 메서드 호출을 호출의 첫 번째 인수에 대한getClass()호출로 다시 작성합니다 (null 검사는 유지되지만 메시지는 없음).remove는 검사를 완전히 삭제합니다.
기본적으로 R8은 remove_message를 사용합니다. -processkotlinnullchecks 사양은 이를 재정의합니다. 여러 번 지정하면 가장 강력한 값이 사용됩니다.
컴패니언 메서드에 유지 정보 전파 중지
유지 규칙이 디슈가링 대상인 인터페이스 메서드와 일치하는 경우 R8은 이전에 최적화 허용 안함 및 축소 허용 안함 비트를 합성된 컴패니언 메서드로 내부적으로 전송했습니다.
AGP 9.0부터는 유지 규칙이 더 이상 컴패니언 메서드에 적용되지 않습니다. 이는 유지 규칙이 다른 컴파일러 합성 필드/메서드/클래스에 적용되지 않는다는 사실과 일치합니다.
최적화 허용 안함 및 축소 허용 안함 비트를 컴패니언 메서드로 전송하면 이전에는 다음 사용 사례가 지원되었습니다.
default/static/private인터페이스 메서드가 있는 라이브러리를minSdk< 24인 DEX 및 인터페이스 메서드를 유지하는 규칙으로 컴파일합니다.- 클래스 경로 및
-applymapping에 라이브러리가 있는 앱을 컴파일합니다. - 앱과 라이브러리를 병합합니다.
disallow
obfuscation 비트가 컴패니언 메서드로 전송되지 않으므로 이는 -applymapping에서만 작동합니다. 즉, 1단계에서 생성된 컴패니언 클래스에는 난독화된 메서드 이름이 있습니다.
앞으로 이 사용 사례는 minSdk < 24에서 더 이상 지원되지 않습니다. 해결 방법은 다음과 같습니다.
default/static/private인터페이스 메서드가 있는 라이브러리를minSdk< 24인 클래스 파일로 디슈가링합니다.- R8 및 컴패니언 클래스에서 인터페이스 메서드를 유지하는 규칙을 사용하여 디슈가링된 아티팩트를 컴파일합니다.
- 클래스 경로에 라이브러리가 있는 앱을 컴파일합니다.
- 앱과 디슈가링된 아티팩트를 병합합니다.
이로 인한 부작용으로 인해 인터페이스 컴패니언 메서드 내에서 익명 클래스와 로컬 클래스의 내부 클래스 및 바깥쪽 메서드 속성을 더 이상 유지할 수 없게 됩니다.
기본 내보낸 소스 파일을 r8-map-id-<MAP_ID>로 변경
이 변경사항은 8.12.0부터 AGP에 적용됩니다.
클래스의 기본 내보낸 소스 파일 속성은 리트레이싱이 필요할 때 (즉, 난독화 또는 최적화가 사용 설정된 경우) SourceFile에서 r8-map-id-<MAP_ID>로 변경됩니다.
난독화된 스택 트레이스가 있는 경우 새 소스 파일 속성을 사용하면 다시 추적하는 데 필요한 매핑 파일의 ID를 추출할 수 있으며, 이는 Logcat에서 스택 트레이스의 자동 다시 추적을 지원하는 데 사용할 수 있습니다.
커스텀 소스 파일 속성 (-renamesourcefileattribute)을 사용하는 경우 이 커스텀 소스 파일 속성이 계속 우선 적용됩니다.
ProGuard 호환성 모드 (gradle.properties에 android.enableR8.fullMode=false가 포함된 경우)에서 r8-map-id-<MAP_ID>의 소스 파일 속성을 내보내는 것은 SourceFile 속성이 유지되지 않는 경우에만 적용됩니다. ProGuard 호환성 모드를 사용하고 스택 트레이스에 매핑 파일 ID를 포함하려는 앱은 -keepattributes SourceFile를 삭제하거나 R8 전체 모드로 이전해야 합니다.
r8-map-id-<MAP_ID>에서 사용되는 맵 ID는 전체 맵 해시이며 이전에 사용된 맵 해시의 7자 프리픽스가 아닙니다.
L8 디슈가링에서 최소화된 합성 이름 사용 설정
D8에서 생성된 합성 클래스의 이름에는 일반적으로 D8에서 생성된 합성임을 나타내는 하위 문자열 $$ExternalSynthetic가 포함됩니다.
또한 합성의 이름은 합성 종류 (예: Backport, Lambda)도 인코딩합니다. 이는 클래스 이름이 문자열 풀에서 더 많은 공간을 차지하므로 결과 DEX 크기에 부정적인 영향을 미칩니다.
AGP 9.0은 모든 j$ 클래스를 포함하는 DEX 파일이 합성 클래스에 새로운 축약된 클래스 이름 형식을 사용하도록 L8 (핵심 라이브러리 디슈가링)을 구성합니다. 새 클래스 이름은 숫자 ID (예: $1)를 사용합니다.
-addconfigurationdebugging 지원 삭제
AGP 9.0에서는 -addconfigurationdebugging 지원이 삭제됩니다. 이제 플래그가 사용되면 컴파일러에서 경고를 보고합니다.
D8/R8에서 L8 규칙 생성 지원 삭제
이 변경사항은 D8/R8 명령줄 또는 API를 직접 사용하는 개발자에게만 적용됩니다.
R8 9.0에서는 D8 및 R8에서 L8의 유지 규칙을 생성하는 기능이 삭제됩니다.
대신 이 용도로 TraceReferences를 사용해야 합니다.
구체적으로는 D8Command.builder.setDesugaredLibraryKeepRuleConsumer 및 R8Command.Builder.setDesugaredLibraryKeepRuleConsumer 메서드가 삭제되고 --desugared-lib-pg-conf-output 지원이 D8 및 R8의 명령줄 옵션에서 삭제됩니다.
해결된 문제
Android Gradle 플러그인 9.0.0
| 해결된 문제 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Android Gradle 플러그인 |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 린트 |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 린트 통합 |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 축소기(R8) |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||