Android Gradle 플러그인 8.1.0 (2023년 7월)

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

호환성

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

Kotlin DSL이 빌드 구성의 기본값입니다.

이제 새 프로젝트는 빌드 구성에 기본적으로 Kotlin DSL (build.gradle.kts)을 사용합니다. 이렇게 하면 문법 강조 표시, 코드 완성, 선언으로의 탐색을 통해 Groovy DSL(build.gradle)보다 더 나은 편집 환경을 제공할 수 있습니다. 빌드 구성에 AGP 8.1 및 Kotlin DSL을 사용하는 경우 최상의 환경을 위해 Gradle 8.1을 사용해야 합니다. 자세한 내용은 Kotlin DSL 이전 가이드를 참고하세요.

자동 앱별 언어 지원

Android 스튜디오 Giraffe Canary 7 및 AGP 8.1.0-alpha07부터 앱이 앱별 언어 설정을 자동으로 지원하도록 구성할 수 있습니다. Android Gradle 플러그인은 프로젝트 리소스를 기반으로 LocaleConfig 파일을 생성하고 최종 매니페스트 파일에 이에 대한 참조를 추가하므로 더 이상 수동으로 이 작업을 하지 않아도 됩니다. AGP는 앱 모듈의 res 폴더에 있는 리소스 및 모든 라이브러리 모듈 종속 항목을 사용하여 LocaleConfig 파일에 포함할 언어를 결정합니다.

자동 앱별 언어 기능은 Android 13(API 수준 33) 및 이후 버전을 실행하는 앱을 지원합니다. 이 기능을 사용하려면 compileSdkVersion을 33 이상으로 설정해야 합니다. 이전 버전의 Android에서 앱별 언어 설정을 구성하려면 API와 인앱 언어 선택 도구를 사용해야 합니다.

자동 앱별 언어 지원을 사용 설정하려면 기본 언어를 지정합니다.

  1. 앱 모듈의 res 폴더에서 resources.properties라는 새 파일을 만듭니다.
  2. resources.properties 파일에서 unqualifiedResLocale 라벨을 사용하여 기본 언어를 설정합니다. 언어 이름을 만들려면 언어 코드에 스크립트(선택사항)와 지역 코드(선택사항)를 대시로 구분하여 결합합니다.

    • 언어: 두 글자 또는 세 글자로 된 ISO 639-1 코드를 사용합니다.
    • 스크립트 (선택사항): ISO 15924 코드를 사용합니다.
    • 지역 (선택사항): 두 글자로 된 ISO 3166-1-alpha-2 코드 또는 3자리로 된 UN_M.49 코드를 사용합니다.

    예를 들어 기본 언어가 미국 영어인 경우:

        unqualifiedResLocale=en-US
        

AGP는 res 폴더의 values-* 디렉터리를 사용하여 이 기본 언어와 개발자가 지정한 모든 대체 언어를 자동 생성된 LocaleConfig 파일에 추가합니다.

자동 앱별 언어 지원은 기본적으로 사용 중지되어 있습니다. 이 기능을 사용 설정하려면 모듈 수준 build.gradle.kts 파일 (Groovy를 사용하는 경우 build.gradle 파일)의 androidResources {} 블록에 있는 generateLocaleConfig 설정을 사용합니다.

Kotlin

android {
  androidResources {
    generateLocaleConfig = true
  }
}

Groovy

android {
  androidResources {
    generateLocaleConfig true
  }
}

Android 린트에 JVM 17을 타겟팅하는 바이트 코드가 포함됨

AGP 8.1.0-alpha04부터 Android 린트에는 JVM 17을 타겟팅하는 바이트 코드가 포함됩니다. 맞춤 린트 검사를 작성하는 경우 JDK 17 이상으로 컴파일하고 Kotlin 컴파일러 옵션에 jvmTarget = '17'를 지정해야 합니다.

린트 도구에 관해 자세히 알아보려면 린트 검사로 코드 개선을 참고하세요.

네이티브 라이브러리 압축 설정이 DSL로 이동함

AGP 8.1.0-alpha10부터 매니페스트 대신 DSL을 사용하여 네이티브 라이브러리 압축을 구성하지 않으면 경고가 표시됩니다. 다음 안내에서는 DSL을 사용하도록 구성을 업데이트하는 방법을 설명합니다. 이러한 업데이트를 하는 데 도움이 필요하면 AGP 업그레이드 어시스턴트(도구 > AGP 업그레이드 어시스턴트)를 사용하세요.

비압축 네이티브 라이브러리를 사용하려면 매니페스트에서 android::extractNativeLibs 속성을 삭제하고 모듈 수준 build.gradle.kts 파일 (Groovy를 사용하는 경우 build.gradle 파일)에 다음 코드를 추가합니다.

Kotlin

android {
  packagingOptions {
    jniLibs {
      useLegacyPackaging = false
    }
  }
}

Groovy

android {
  packagingOptions {
    jniLibs {
      useLegacyPackaging false
    }
  }
}

실험용 빌드 플래그

AGP 8.1에서 사용할 수 있는 빌드 구성을 위한 실험용 플래그입니다.

플래그 추가됨 기본값 참고
android.experimental.useDefaultDebugSigningConfigForProfileableBuildtypes AGP 8.0 false 서명 구성을 지정하지 않고 이 옵션을 사용 설정하면 AGP가 프로파일링 가능 또는 디버그 가능한 빌드를 실행할 때 기본 디버그 서명 구성을 사용합니다. 이 플래그는 빌드 작성자가 특정 프로파일링 서명 구성을 선언하도록 유도하기 위해 기본적으로 사용 중지됩니다.
android.experimental.library.desugarAndroidTest AGP 8.0 false 이 플래그를 사용하면 라이브러리 빌더가 린팅을 통해 생성된 AAR에 영향을 주지 않고 테스트 APK의 핵심 라이브러리 디슈가링을 사용 설정할 수 있습니다. Google은 향후 Variant API에서 이 동작을 지원할 계획입니다.
android.experimental.testOptions.managedDevices.customDevice AGP 8.0 false 사용 설정하면 Gradle 관리 기기에서 플러그인이 제공할 수 있는 사용자 정의 맞춤 기기 유형을 허용합니다. Firebase Test Lab 플러그인을 사용하려면 이 플래그를 사용 설정해야 합니다.
android.lint.printStackTrace AGP 8.0 false 사용 설정하면 Android 린트가 비정상 종료되면 스택 트레이스를 출력합니다. 이 플래그는 LINT_PRINT_STACKTRACE 환경 변수와 동일한 기능을 갖습니다.
android.experimental.testOptions.managedDevices.maxConcurrentDevices AGP 8.0 없음 특정 시점에 활성 상태일 수 있는 최대 동시 Gradle 관리 기기(AVD) 수를 지정합니다. 값이 0이거나 음수인 경우 최대 기기 수가 없습니다.
android.experimental.testOptions.installApkTimeout AGP 8.0 없음 APK를 설치하는 제한 시간(초)입니다. 값이 0이거나 음수이면 UTP에 의해 기본값으로 설정됩니다.

해결된 문제

Android Gradle 플러그인 8.1.0

해결된 문제
Android Gradle 플러그인
구성 캐시 관련 `com.android.build.gradle.tasks.ShaderCompile` 문제
AGP API를 사용하여 Java 리소스에 추가하면 구성 캐시가 손상됨
[Android 스튜디오: Flamingo | 2022.2.1 Canary 8] liblog.so가 APK 내에 패키징됨
KGP가 구성 중에 매니페스트를 읽어 매니페스트 변경 시 구성 캐시를 무효화함
병합된 매니페스트에 문제가 있는 경우 빌드 경고 메시지가 명확하지 않음
AGP 7.4로 업그레이드하면 StackOverflowError가 발생함
Kotlin 라이브러리 하위 프로젝트에 직접 종속되는 동적 기능의 ClassNotFoundException
테스트 변형의 매니페스트 자리표시자와 함께 processDebugUnitTestManifest가 실패함
테스트 변형의 매니페스트 자리표시자와 함께 processDebugUnitTestManifest가 실패함
네임스페이스 속성이 HasAndroidResources에 속할 가능성이 높음
'Gradle 파일이 마지막 프로젝트 동기화 이후 변경됨' 메시지를 사용 중지할 수 없음
Android Gradle 플러그인이 최신 버전이 아닌 경우 '최신 버전의 Android Gradle 플러그인을 사용하는 것이 좋음'
테스트 변형의 매니페스트 자리표시자와 함께 processDebugUnitTestManifest가 실패함
CheckAarMetadataTask에서 컴파일 SDK 검사를 사용 중지하기 위한 불리언 플래그
빌드 오류가 존재하지 않는 API 수준 34를 참조함
JVM 도구 모음을 설정해도 JavaCompile targetCompatibility 값에 영향을 주지 않음
와일드 카드 도메인이 있는 탐색 deepLink 항목에는 병합된 매니페스트에 `android:host` 속성이 없음
Android Gradle 플러그인 8.1 이후 processDebugMainManifest 작업 실패함
AnalyticsRecordingTask를 삭제할 수 있나요?
output-metadata.json의 콘텐츠가 일치하지 않음
AnalyticsRecordingTask를 삭제할 수 있나요?
output-metadata.json의 콘텐츠가 일치하지 않음
JVM 도구 모음을 설정해도 JavaCompile targetCompatibility 값에 영향을 주지 않음
와일드 카드 도메인이 있는 탐색 deepLink 항목에는 병합된 매니페스트에 `android:host` 속성이 없음
Android Gradle 플러그인 8.1 이후 processDebugMainManifest 작업이 실패함
Android 스튜디오가 STUDIO_GRADLE_JDK 환경 변수를 사용하지 않음
맞춤 소스 유형은 여러 버전의 소스 세트를 만들어야 함
DependenciesInfoBuilder에 API 업데이트 및 문서가 필요함
Java 11 타겟인 DexingNoClasspathTransform(minSdk >= 24)이 중첩 멤버 누락으로 인해 실패함
DslExtension.Builder.extendProjectWith()가 Groovy에 설명된 대로 작동하지 않음
kotlin.Pair를 사용하지 않는 VariantSelector.withFlavor API 추가
`proguard.txt`가 변경되었기 때문에 AndroidLintAnalysisTask(:lintAnalyzeExternalRelease)에 캐시 부적중이 발생함
앱 병합 매니페스트에는 종속 항목의 extractNativeLibs 속성 및 useEmbeddedDex 속성이 포함되어 있음
AGP: AIDL 도구 및 프레임워크 AIDL 파일의 경로를 공개 API로 노출함
요청: IDE에서 'PermittedSubclasses requires ASM9'의 수정사항을 제공해야 함
버그: 'KSP를 사용 설정하고 이 종속 항목에 KSP 프로세서를 사용하세요'가 웹사이트로 이동함
Gradle 8.1에서 .gradle/.android/analytics.settings로 인해 구성 캐싱이 중단됨
agp 8.1.0의 generateLocaleConfig가 비확정적인 순서를 사용하여 재현 가능한 빌드를 손상시킴
Dexer(D8)
최근 업데이트 후 핵심 라이브러리 디슈가링으로 인해 앱이 비정상 종료됨
API 21의 agp 8.1.0 회귀 - F/dex2oat(4176): art/compiler/driver/compiler_driver.cc:1181] 확인 실패: !method->IsAbstract()
린트
린트가 상속된 인터페이스가 아닌 직접 구현된 인터페이스의 안전한 전송만 확인함
린트가 호출 수신자의 유효한 전송을 확인하지 않음
TypedArray#close(API 31)가 디슈가링되지 않지만 AS는 try-with-resources에서 사용될 때 경고를 표시하지 않음
버그: ''BC' 제공업체가 지원 중단되었으며 Android P를 기준으로 합니다'에 관한 거짓양성 경고
Kotlin 1.8.0으로 업그레이드한 후 remember에 관련 린트 거짓양성
enum 매개변수가 있는 메서드 내부에서 실행되는 SDK_INT 검사의 거짓양성 린트 경고
TypographyQuotes 린트 검사가 이스케이프된 따옴표에서 작동하지 않음
TrustAllX509TrustManager 린트 검사가 X509TrustManager를 확장하는 인터페이스를 잘못 표시함
교체 수정사항의 삽입된 코드만 형식을 다시 지정함
린트: 인텐션 미리보기에서 ReplaceStringQuickFix 관련 예외가 발생함
축소기(R8)
VerifyError: R8을 Kotlin 1.8.20과 함께 사용할 때 인증 도구가 클래스를 거부함
AGP 8의 R8로 인해 Google 피트니스 서비스가 중단됨
입력 이름에 중복되는 이름이 있는 소스 파일 정보를 포함할 경우 올바르게 표시되지 않음
Compose 빌드 중에 ArrayIndexOutOfBoundsException과 함께 R8이 실패함
간단한 StringBuilder 관련 코드에서 출시 또는 debuggable=false 모드에 추가할 꼬리 호출이 누락됨
VirtualDispatchMethodArgumentPropagator.shouldActivateMethodStateGuardedByBounds() 메서드의 코너 케이스
dex-startup-optimization으로 인해 java.lang.VerifyError: 클래스 거부됨 오류가 발생함
Android 12 이상에서 인증 오류와 함께 비정상 종료

Android Gradle 플러그인 8.1.1

해결된 문제
Dexer(D8)
Java 16 레코드: equals(null)이 NullPointerException을 발생시킴
축소기(R8)
java.lang.VerifyError: 인증 도구에서 클래스를 거부함
Apache POI 라이브러리를 사용할 때 빌드가 :minifyReleaseWithR8에서 멈춤
R8 최적화를 사용 설정할 때 호출 거부
java.lang.reflect.Executable의 NoClassDefFoundError

Android Gradle 플러그인 8.1.2

해결된 문제
Android Gradle 플러그인
Android 라이브러리 모듈에서 androidResources를 사용할 수 없음
[AGP 8.1.0] splits.abi.isEnable과 testOptions.unitTests.isIncludeAndroidResources가 모두 true인 경우 ./gradlew 테스트가 실패하고 "Unable to find manifest output" 발생
축소기(R8)
Kotlin 1.9로 인해 null 검사가 제거되면 R8에 의해 Kotlin 람다가 소멸됨
play-services-measurement-21.3.0-runtime.jar에 '컴파일 중에 정의되지 않은 값이 발생했습니다' 오류가 발생하여 R8이 실패함

Android Gradle 플러그인 8.1.3

해결된 문제
Android Gradle 플러그인
[AGP 8.1.0] splits.abi.isEnable과 testOptions.unitTests.isIncludeAndroidResources가 모두 true인 경우 ./gradlew 테스트가 실패하고 "Unable to find manifest output" 발생
AGP 8.1로 업데이트한 후 빌드 실패

Android Gradle 플러그인 8.1.4

해결된 문제
Android Gradle 플러그인
하위 프로젝트의 클래스가 아티팩트 변환을 통해 이미 덱싱되었으므로 하위 프로젝트의 클래스에서 덱싱 작업을 실행하지 않음