Android Gradle 플러그인 8.0.0 (2023년 4월)

Android Gradle 플러그인 8.0.0은 다양한 새 기능과 개선사항이 포함된 주요 버전입니다.

호환성

최소 버전 기본 버전 참고
Gradle 8.0 8.0 자세한 내용은 Gradle 업데이트하기를 참고하세요.
SDK 빌드 도구 30.0.3 30.0.3 SDK 빌드 도구를 설치 또는 구성합니다.
NDK 해당 사항 없음 25.1.8937393 다른 버전의 NDK를 설치 또는 구성합니다.
JDK 17 17 자세한 내용은 JDK 버전 설정을 참고하세요.

패치 출시

다음은 Android Gradle 플러그인 8.0의 패치 출시 목록입니다.

Android Gradle 플러그인 8.0.2 (2023년 5월)

AGP 8.0.2에서 수정된 버그 목록은 Android 스튜디오 2022.2.1 해결된 문제를 참고하세요.

Android Gradle 플러그인 8.0.1 (2023년 5월)

이번 소규모 업데이트는 다음과 같은 버그 수정을 포함합니다.

해결된 문제
오류: AGP 7.2.2에서 7.4.0으로 업그레이드한 후 'No VersionRequirement with the given id in the table' 오류 발생
markTypeAsLive AGP 7.4.1에서 R8 NullPointerException 발생
[R8 4.0.53] Android 11에서 하드 클래스 인증 실패

중단 변경사항: 모듈 수준 빌드 스크립트에 네임스페이스 필요

네임스페이스는 매니페스트 파일이 아닌 모듈 수준 build.gradle.kts 파일에서 설정해야 합니다. AGP 7.3부터 namespace DSL 속성을 사용할 수 있습니다. 자세한 내용은 네임스페이스 설정을 참고하세요.

네임스페이스 DSL로 이전할 때는 다음 문제에 유의하세요.

  • 이전 버전의 AGP는 경우에 따라 기본 네임스페이스 또는 애플리케이션 ID에서 테스트 네임스페이스를 잘못 추론합니다. AGP 업그레이드 어시스턴트는 프로젝트의 기본 네임스페이스와 테스트 네임스페이스가 동일한 경우 업그레이드를 차단합니다. 업그레이드가 차단된 경우 testNamespace를 수동으로 변경하고 소스 코드를 적절하게 수정해야 합니다.
  • 테스트 네임스페이스를 변경한 후 코드는 컴파일되지만 계측 테스트가 런타임에 실패할 수 있습니다. 계측 테스트 소스 코드가 androidTest 및 앱 소스 모두에 정의된 리소스를 참조하는 경우 이러한 오류가 발생할 수 있습니다.

자세한 내용은 문제 #191813691 댓글 #19를 참고하세요.

중대한 변경사항: 빌드 옵션 기본값

AGP 8.0부터 빌드 성능을 개선하기 위해 이러한 플래그의 기본값이 변경되었습니다. 이러한 변경사항 중 일부를 지원하도록 코드를 조정하는 데 도움이 필요하면 AGP 업그레이드 어시스턴트(도구 > AGP 업그레이드 어시스턴트)를 사용하세요. 업그레이드 어시스턴트는 새 동작을 수용하도록 코드를 업데이트하거나 이전 동작을 유지하도록 플래그를 설정하는 방법을 안내합니다.

플래그 새 기본값 이전 기본값 참고
android.defaults.buildfeatures.buildconfig false true AGP 8.0은 기본적으로 BuildConfig를 생성하지 않습니다. 필요한 프로젝트에서 DSL을 사용하여 이 옵션을 지정해야 합니다.
android.defaults.buildfeatures.aidl false true AGP 8.0은 기본적으로 AIDL 지원을 사용 설정하지 않습니다. 필요한 프로젝트에서 DSL을 사용하여 이 옵션을 지정해야 합니다. 이 플래그는 AGP 9.0에서 삭제될 예정입니다.
android.defaults.buildfeatures.renderscript false true AGP 8.0은 기본적으로 RenderScript 지원을 사용 설정하지 않습니다. 필요한 프로젝트에서 DSL을 사용하여 이 옵션을 지정해야 합니다. 이 플래그는 AGP 9.0에서 삭제될 예정입니다.
android.nonFinalResIds true false AGP 8.0은 기본적으로 최종이 아닌 필드가 있는 R 클래스를 생성합니다.
android.nonTransitiveRClass true false AGP 8.0은 현재 모듈에 정의된 리소스에 대해서만 R 클래스를 생성합니다.
android.enableR8.fullMode true false AGP 8.0은 기본적으로 R8 전체 모드를 사용 설정합니다. 자세한 내용은 R8 전체 모드를 참고하세요.

중대한 변경사항: 적용된 빌드 옵션 값

AGP 8.0부터는 더 이상 이러한 플래그의 값을 변경할 수 없습니다. gradle.properties 파일에서 지정하면 값이 무시되고 AGP에서 경고를 출력합니다.

플래그 적용된 값 참고
android.dependencyResolutionAtConfigurationTime.warn true AGP 8.0은 구성 단계 중에 구성 확인을 감지하면 경고를 내보냅니다. 구성 확인은 Gradle 구성 시간에 부정적인 영향을 미치기 때문입니다.
android.r8.failOnMissingClasses true AGP 8.0은 더 나은 DEX 최적화를 위해 누락된 클래스가 있는 경우 R8을 사용하는 빌드를 실패시킵니다. 이 문제를 해결하려면 누락된 라이브러리 또는 -dontwarn 보관 규칙을 추가해야 합니다. 자세한 내용은 R8 축소기에서 클래스 경고 누락을 참고하세요.
android.testConfig.useRelativePath true 단위 테스트에서 Android 리소스, 애셋, 매니페스트 사용 지원이 사용 설정된 경우 AGP 8.0은 상대 경로만 포함된 test_config.properties 파일을 생성합니다. 이렇게 하면 Android 단위 테스트에서 항상 Gradle 빌드 캐시를 사용할 수 있습니다.
android.useNewJarCreator true AGP는 JAR 파일을 만들 때 Zipflinger 라이브러리를 사용하여 빌드 성능을 개선합니다.
android.bundletool.includeRepositoriesInDependencyReport true AAB 및 APK에 SDK 종속 항목 정보를 추가하는 기능이 사용 설정된 경우 AGP 8.0은 이 정보에 프로젝트 저장소 목록도 추가합니다. 자세한 내용은 Play Console의 종속 항목 정보를 참고하세요.
android.enableArtProfiles true 이제 기준 프로필이 항상 생성됩니다. 자세한 내용은 기준 프로필을 참고하세요.
android.enableNewResourceShrinker true 기본적으로 새 리소스 좁히기 구현을 사용합니다. 새로운 리소스 축소 도구에는 동적 기능 지원이 포함되어 있습니다.
android.enableSourceSetPathsMap true 상대 리소스 경로 매핑을 계산하는 데 사용되므로 Gradle 빌드가 더 자주 업데이트됩니다.
android.cacheCompileLibResources true 이제 Gradle이 프로젝트 위치를 기준으로 리소스 파일을 추적하므로 컴파일된 라이브러리 리소스를 기본적으로 캐시할 수 있습니다. android.enableSourceSetPathsMap를 사용 설정해야 합니다.
android.disableAutomaticComponentCreation true AGP 8.0은 기본적으로 SoftwareComponent를 생성하지 않습니다. 대신 AGP는 게시 DSL을 사용하여 게시되도록 구성된 변형에 대해서만 SoftwareComponents를 만듭니다.

실행 프로필의 새로운 안정적인 플래그

AGP에는 새 플래그 android.settings.executionProfile가 포함됩니다. 이 플래그를 사용하여 SettingsExtension의 기본 실행 프로필을 재정의합니다. 자세한 내용은 설정 플러그인 문서를 참고하세요.

실험 플래그를 미리 보려면 미리보기 출시 노트를 참고하세요.

Kotlin 지연 속성 할당이 지원되지 않음

빌드 스크립트에 Gradle의 Kotlin DSL을 사용하는 경우 Android 스튜디오 및 AGP 8.0은 = 연산자를 사용하는 실험용 속성 할당을 지원하지 않습니다. 이 기능에 관한 자세한 내용은 출시 노트문서를 참고하세요.

빌드 분석 도구 작업 카테고리

Android 스튜디오 Flamingo부터 Build Analyzer에 빌드 시간에 영향을 미치는 작업을 위한 새로운 기본 보기가 있습니다. 프로젝트에서 AGP 8.0 이상을 사용하는 경우 빌드 분석 도구는 작업을 개별적으로 표시하는 대신 카테고리별로 그룹화합니다. 예를 들어 Android 리소스, Kotlin 또는 Dexing과 관련된 태스크가 그룹화된 후 빌드 시간별로 정렬됩니다. 이를 통해 빌드 시간에 가장 큰 영향을 미치는 카테고리를 쉽게 알 수 있습니다. 각 카테고리를 펼치면 해당하는 작업 목록이 표시됩니다. 그룹화하지 않고 태스크를 개별적으로 표시하려면 그룹 기준 드롭다운을 사용하세요.

빌드 분석 도구 작업 카테고리

새 설정 플러그인

AGP 8.0.0-alpha09에서는 새로운 설정 플러그인이 도입되었습니다. 설정 플러그인을 사용하면 모든 모듈에 적용되는 글로벌 구성을 한곳으로 중앙 집중화할 수 있으므로 여러 모듈에서 구성을 복사하여 붙여넣을 필요가 없습니다. 또한 설정 플러그인을 사용하여 도구 실행 프로필 또는 도구를 실행하는 방법에 관한 다양한 안내를 만들고 그 사이를 전환할 수 있습니다.

설정 플러그인을 사용하려면 settings.gradle 파일에 플러그인을 적용합니다.

apply plugin 'com.android.settings'

전역 구성 중앙화

전역 구성을 구성하려면 settings.gradle 파일에서 새 android 블록을 사용하세요. 예를 들면 다음과 같습니다.

android {
  compileSdk 31
  minSdk 28
  ...
}

도구 실행 프로필

설정 플러그인을 사용하면 일부 도구의 실행 프로필을 만들 수도 있습니다. 실행 프로필은 도구가 실행되는 방식을 결정합니다. 환경에 따라 다른 실행 프로필을 선택할 수 있습니다. 실행 프로필에서 도구의 JVM 인수를 설정하고 별도의 프로세스에서 실행되도록 구성할 수 있습니다. 현재는 R8 도구만 지원됩니다.

다음 예와 같이 실행 프로필을 만들고 settings.gradle 파일에서 기본 실행 프로필을 설정합니다.

android {
  execution {
    profiles {
      high {
        r8 {
          jvmOptions += ["-Xms2048m", "-Xmx8192m", "-XX:+HeapDumpOnOutOfMemoryError"]
          runInSeparateProcess true
        }
      }
      low {
        r8 {
          jvmOptions += ["-Xms256m", "-Xmx2048m", "-XX:+HeapDumpOnOutOfMemoryError"]
          runInSeparateProcess true
        }
      }
      ci {
        r8.runInSeparateProcess false
      }
    }
    defaultProfile "low"
  }
}

기본 프로필을 재정의하려면 gradle.properties 파일에서 android.experimental.settings.executionProfile 속성을 사용하여 다른 프로필을 선택합니다.

android.experimental.settings.executionProfile=high

명령줄을 사용하여 이 속성을 설정할 수도 있습니다. 그러면 다양한 워크플로를 설정할 수 있습니다. 예를 들어 지속적인 통합 워크플로가 있는 경우 명령줄을 사용하여 settings.gradle 파일을 변경하지 않고도 실행 프로필을 변경할 수 있습니다.

./gradlew assembleRelease \
  -Pandroid.experimental.settings.executionProfile=ci

AGP 8.0을 실행하려면 JDK 17이 필요함

Android Gradle 플러그인 8.0을 사용하여 앱을 빌드하는 경우 이제 Gradle을 실행하려면 JDK 17이 필요합니다. Android 스튜디오 Flamingo는 JDK 17을 번들로 제공하고 Gradle을 기본적으로 사용하도록 구성합니다. 즉, 대부분의 Android 스튜디오 사용자는 프로젝트 구성을 변경할 필요가 없습니다.

Android 스튜디오 내 AGP에 사용되는 JDK 버전을 수동으로 설정해야 하는 경우 JDK 17 이상을 사용해야 합니다.

Android 스튜디오와는 별개로 AGP를 사용하는 경우 JAVA_HOME 환경 변수 또는 -Dorg.gradle.java.home 명령줄 옵션을 JDK 17의 설치 디렉터리로 설정하여 JDK 버전을 업그레이드합니다.

해결된 문제

Android Gradle 플러그인 8.0.0

해결된 문제
Android Gradle 플러그인
MergeResources 작업에서 불안정한 빌드 실패
JavaPluginConvention 및 HasConvention이 지원 중단됨
새 변환 API의 파일 위치가 올바르지 않고 일관되지 않음
Android Gradle 플러그인은 지원 중단된 GUtil.toWords(string) 함수를 사용하면 안 됨
Android Gradle 플러그인은 지원 중단된 ConfigureUtil.configure(closure, target) 함수를 사용하면 안 됨
KGP 1.7.20-Beta를 사용하도록 AGP 테스트 업데이트
Gradle 7.4 실패(AnalyticsService 인스턴스를 만들 수 없음)
AGP 7.4.0-alpha09의 javac에 새로운 '알 수 없는 enum 상수' 표시
구성 캐싱을 사용 설정한 경우에도 MergeGeneratedProguardFilesCreationAction 구성이 느림
[AGP] 생성된 소스 디렉터리를 IDE 모델에 추가(변형 API)
JavaPluginConvention 및 HasConvention이 지원 중단됨
기본적으로 R8에 ignorewarnings를 추가하지 않음
proguard 파일이 없으면 경고
AGP 7.3.0이 gradle 플랫폼 프로젝트의 gradle 동기화를 중단함
apksig 라이브러리: ApkVerifier$Result.getV4SchemeSigners()가 비공개로 표시됨
커버리지가 사용 설정되지 않은 경우 androidJacocoAnt 구성 생성 중지
라이브러리 구성요소의 @IntDef를 사용해도 aar에서 annotation.zip이 생성되지 않음
의 공통 슈퍼 유형을 찾을 수 없음
LINT_PRINT_STACKTRACE=true의 Gradle 속성 버전 추가
AAR로 패키징되는 오래된 prefab 아티팩트
지원 중단 경고를 해결하고 Gradle 9.0에 대비하기 위해 대상 속성에서 outputLocation 속성으로 이전
JavaCompile 작업 설정 시 `--release` 플래그 고려
[AGP-7.3.0-beta03] xml 선언 뒤에 빈 줄이 있으면 ShrinkResourcesNewShrinkerTask가 실패함
디버그 변형에서 기본적으로 lintVital 타겟이 실행됨
proguard 파일이 없으면 경고
AGP는 작업 실행 단계에서 kotlinOptions.freeCompilerArgs를 추가하려고 시도함
Gradle 동기화 실패: 동기화 실패: 이유를 알 수 없음
DependencyReportTask가 구성 캐시와 호환되지 않음
build.gradle에서 resValue로 리소스를 재정의하면 오류: 중복 리소스가 발생함
'debug' 빌드 유형에는 기본 서명 키가 있고 다른 유형에는 없음
동적 기능 및 리소스 축소를 사용하면 런타임이 비정상 종료됨
'debug' 빌드 유형에는 기본 서명 키가 있고 다른 유형에는 없음
린트 모델의 기본 소스 제공자에 Java 디렉터리로 나열되는 소스 디렉터리가 생성됨
Gradle 8.0-milestone-2로 인해 AGP의 예외 발생
앱 및 라이브러리의 매니페스트 병합 최적화
javadoc 생성에 gradle-settings-api 추가
AGP 7.4.0-alpha09의 javac에 새로운 '알 수 없는 enum 상수' 표시
AGP 7.4.0-alpha09에서 Firebase 앱 배포에 업로드되지 않는 빌드를 생성함
모듈의 lint.xml이 린트 작업의 UP-TO-DATE 검사 대상으로 고려되지 않음
Android Gradle 플러그인 7.0 이상 및 Android 테스트 문제: 리소스: id를 찾을 수 없음
configureCMakeDebug가 null 포인터 예외로 비정상 종료됨
AS2022.2.1.5, FireBasePerfPlugin으로 프로젝트를 업그레이드하는 IllegalAccessError
'컬렉션에 조건자와 일치하는 요소가 포함되어 있지 않습니다'라는 알 수 없는 오류와 함께 동기화가 실패함
Instrumentation API가 로컬 파일 종속 항목을 변환하지 않음
7.4 베타 1로 업데이트할 때 'AnnotationProcessorOptions.arguments가 쿼리됨' 오류가 발생함
Gradle 공개 플러그인을 gradle-api로 이동하고 BasePlugin.getExtension을 삭제함
r8.jvmArgs가 사용되지 않음
AGP에 필요한 최소 버전인 JDK17
AGP 8.0.0 A8이 기준 프로필을 손상시킴
AGP 8.0의 CheckAarMetadataTask 메시지에서 'compileSdkVersion'을 'compileSdk'로 변경함
AGP 7.4.0-rc01이 '작업 '...'이(가) 완료되기 전에 map(provider(java.util.Set))의 매핑된 값을 쿼리하는 것은 지원되지 않음'으로 Variant API를 중단함
구성 캐시 관련 `com.android.build.gradle.tasks.ShaderCompile` 문제
AGP API를 사용하여 Java 리소스에 추가하면 구성 캐시가 손상됨
린트 플러그인이 gradle-api의 일부가 아님
DexingFileDependenciesTask.outputKeepRules는 디렉터리이나 OutputFile로 표시됨
AGP 7.4로 업그레이드하면 StackOverflowError가 발생함
테스트 변형의 매니페스트 자리표시자와 함께 processDebugUnitTestManifest가 실패함
린트가 종속 항목 없이 소스 세트 정보에 액세스함
빌드 오류가 존재하지 않는 API 수준 34를 참조함
Android Gradle 플러그인이 최신 버전이 아닌 경우 '최신 버전의 Android Gradle 플러그인을 사용하는 것이 좋음'
android.injected.testOnly=false가 작동하지 않음
Dexer(D8)
AS Canary 6에서 7로 업그레이드 후 전역 합성과 관련된 Dex 병합 오류
Kotlin 메타데이터 라이브러리를 버전 0.6.0으로 업데이트함
API 수준 28~30에서는 JDK-8272564 해결 방법이 필요해 보임
린트
Kotlin 소스에 대한 ResourceType 린트 검사가 작동하지 않음
VersionChecks에서 Kotlin 범위 확인을 처리하지 않음
래핑될 때 InlinedApi의 거짓양성
openInputStream과 관련된 린트 거짓양성 재활용
[빌드 도구/린트] ChecksSdkIntAtLeast 생성자 속성
린트: PartialResults 병합이 잘못 작동함
Android 스튜디오가 지정된 버전을 오래된 것으로 잘못 표시함
AndroidDeprecationInspection.DeprecationFilter EP가 android-plugin.xml 파일에 등록되지 않음
AccessibilityDetector 린트 검사 설명에 업데이트가 필요함
린트 SDK_INT 검사는 임시 로컬 변수를 이해할 수 있어야 함
TestMode.TYPE_ALIAS가 함수 유형을 typealias로 대체할 때 오류 발생
버그: ObjectAnimator가 현재 코드 블록 외부에서 생성된 경우 ObjectAnimator가 시작되지 않았다는 거짓양성 경고 #38이 발생함
린트: mergeOnly 모드에서 애플리케이션 인스턴스 쿼리로 인한 NPE
NonConstantResourceId 린트 규칙이 리소스 ID를 감지하여 상수 값을 할당하지 못함
뷰 ID에 오류가 표시되지 않음
린트 리소스 캐시가 역직렬화되지 않았을 때 린트 오류가 발생함(린트 오류가 아닌 경고가 발생해야 함)
AGP Flamingo 알파 8 린트 NewApi 디슈가 회귀
TypedArray#close(API 31)는 디슈가링되지 않지만 AS는 try-with-resources에서 사용될 때 경고를 표시하지 않음
린트가 유효한 전송에서 호출 수신자를 확인하지 않음
린트가 안전한 전송에서 상속 인터페이스가 아닌 직접 구현된 인터페이스만 확인함
린트 통합
기준 파일은 현재 린트 작업의 입력 및 출력임
축소기(R8)
CF 프레임 인증기에서 발생한 NPE/어설션 오류
필드 조회 캐시 삭제 후 회귀
':app:minifyVariantWithR8'이 AGP 7.4.0-beta02에서 NullPointerException을 발생시킴
R8: -allowaccessmodification인 경우 ClassNotFoundException
메타데이터에 컨텍스트 수신기 지원 추가
java.lang.VerifyError: Verifier rejected class androidx.compose.ui.graphics.colorspace.o: void androidx.compose.ui.graphics.colorspace.o.(java.lang.Object) failed to verify: void androidx.compose.ui.graphics.colorspace.o.(java.lang.Object): [0x0] cannot access instance field java.lang.Object androidx.compose.ui.graphics.colorspace.n.a from object of type Precise Reference: androidx.compose.ui.graphics.colorspace.o
AGP 7.4.0/7.3.1 - 푸시할 수 없는 enqueuer 작업 목록의 작업을 대기열에 추가하려고 함
Renderscript 코드 축소: AGP를 7.3.1에서 7.4.0으로 업그레이드할 때 성능이 크게 저하됨

Android Gradle 플러그인 8.0.1

해결된 문제
축소기(R8)
오류: AGP 7.2.2에서 7.4.0으로 업그레이드한 후 'No VersionRequirement with the given id in the table' 오류 발생
markTypeAsLive AGP 7.4.1에서 R8 NullPointerException 발생
[R8 4.0.53] Android 11에서 하드 클래스 인증 실패

Android Gradle 플러그인 8.0.2

해결된 문제
축소기(R8)
Compose 빌드 중에 ArrayIndexOutOfBoundsException과 함께 R8이 실패함
VerifyError: R8을 Kotlin 1.8.20과 함께 사용할 때 인증 도구가 클래스를 거부함
AGP 8의 R8로 인해 Google 피트니스 서비스가 중단됨
입력 이름에 중복되는 이름이 있는 소스 파일 정보를 포함할 경우 올바르게 표시되지 않음