Android Gradle 플러그인 7.0.0(2021년 7월)

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

7.0.1(2021년 8월)

이번 소규모 업데이트는 다양한 버그 수정을 포함합니다. 중요한 버그 수정 목록을 보려면 업데이트 출시 블로그에서 관련 게시물을 읽어보세요.

호환성

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

AGP 7.0을 실행하려면 JDK 11이 필요함

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

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

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

지원 중단된 SDK 도구 패키지의 SDK Manager 및 AVD Manager는 JDK 11에서 작동하지 않습니다. AGP 7.0 이상에서 SDK Manager와 AVD Manager를 계속 사용하려면 현재 사용 중인 Android SDK 명령줄 도구 패키지에서 새 버전의 도구로 전환해야 합니다.

변형 API가 안정적으로 실행됨

이제 새 Variant API가 안정적으로 실행됩니다. com.android.build.api.variant 패키지의 새로운 인터페이스와 gradle-recipes GitHub 프로젝트의 예를 참고하세요. 새로운 Variant API의 일부로 Artifacts 인터페이스를 통해 아티팩트라는 다수의 중간 파일을 사용할 수 있도록 했습니다. 병합된 매니페스트와 같은 이러한 아티팩트는 서드 파티 플러그인과 코드를 사용하여 안전하게 가져오고 맞춤설정할 수 있습니다.

Google은 새로운 기능을 추가하고 맞춤설정에 사용할 수 있는 중간 아티팩트의 수를 늘려 Variant API를 계속 확장할 예정입니다.

린트의 동작 변경사항

이 섹션에서는 Android Gradle 플러그인 7.0.0의 여러 가지 린트 동작 변경사항을 설명합니다.

라이브러리 종속 항목의 린트가 개선됨

이제 checkDependencies = true인 상태에서 린트를 실행하면 이전보다 속도가 더 빠릅니다. 라이브러리 종속 항목이 있는 앱으로 구성된 Android 프로젝트의 경우 아래와 같이 checkDependenciestrue로 설정하고 ./gradlew :app:lint를 통해 린트를 실행하는 것이 좋습니다. 그러면 모든 종속 항목 모듈이 동시에 분석되고 앱과 모든 종속 항목에서 발생한 문제가 포함된 단일 보고서가 생성됩니다.

Groovy

// build.gradle
android {
  ...
  lintOptions {
    checkDependencies true
  }
}

Kotlin

// build.gradle.kts
android {
  ...
  lint {
    isCheckDependencies = true
  }
}

이제 린트 작업이 UP-TO-DATE일 수 있음

모듈의 소스 및 리소스가 변경되지 않은 경우 모듈에 관해 린트 분석 작업을 다시 실행할 필요가 없습니다. 이 경우 Gradle 출력에서 작업 실행이 'UP-TO-DATE'로 표시됩니다. 변경사항이 있을 때 checkDependencies = true인 애플리케이션 모듈에서 린트를 실행할 경우 변경된 모듈에서만 분석을 실행하면 됩니다. 그 결과, 린트가 훨씬 더 빠르게 실행될 수 있습니다.

입력이 변경되지 않은 경우에도 린트 보고서 작업을 실행할 필요가 없습니다. 린트 작업이 UP-TO-DATE일 때 stdout에 린트 텍스트 출력이 표시되지 않는다는 관련 알려진 문제가 있습니다(문제 #191897708).

동적 기능 모듈에서 린트 실행

AGP는 더 이상 동적 기능 모듈에서의 린트 실행을 지원하지 않습니다. 상응하는 애플리케이션 모듈에서 린트를 실행하면 동적 기능 모듈에서 린트가 실행되고 앱의 린트 보고서에 모든 문제가 포함됩니다. 앱 모듈에서 checkDependencies = true인 상태에서 린트를 실행할 경우 동적 기능 라이브러리 종속 항목은 동시에 앱 종속 항목이 아닌 한, 검사되지 않는다는 관련 알려진 문제가 있습니다. (문제 #191977888)

기본 변형에 관해서만 린트 실행

이제 ./gradlew :app:lint를 실행하면 기본 변형에 관해서만 린트가 실행됩니다. 이전의 AGP 버전에서는 모든 변형에 린트를 실행했습니다.

R8 축소기에서 클래스 경고 누락

R8은 누락된 클래스와 -dontwarn 옵션을 더 정확하고 일관되게 처리합니다. 따라서 R8에서 생성된 누락 클래스의 경고부터 파악해야 합니다.

R8이 앱 또는 종속 항목 중 하나에 정의되지 않은 클래스 참조를 발견하면 경고를 생성하고, 이 경고는 빌드 출력에 표시됩니다. 예를 들면 다음과 같습니다.

R8: Missing class: java.lang.instrument.ClassFileTransformer

이 경고는 앱 코드를 분석할 때 java.lang.instrument.ClassFileTransformer 클래스 정의를 찾을 수 없음을 의미합니다. 일반적으로 이는 오류가 있음을 의미하지만 이 경고를 무시해도 괜찮은 경우가 있을 수 있습니다. 다음과 같은 일반적인 두 가지 이유에서는 경고를 무시할 수 있습니다.

  1. JVM을 타겟팅하고 있는 라이브러리와 JVM 라이브러리 유형의 누락된 클래스임 (위 예에서처럼)

  2. 종속 항목 중 하나가 컴파일 시간 전용 API를 사용함

proguard-rules.pro 파일에 -dontwarn 규칙을 추가하여 누락 클래스 경고를 무시할 수 있습니다. 예를 들면 다음과 같습니다.

-dontwarn java.lang.instrument.ClassFileTransformer

편의를 위해 AGP는 누락될 수 있는 모든 규칙이 포함된 파일을 생성하고 이러한 규칙을 app/build/outputs/mapping/release/missing_rules.txt 같은 파일 경로에 씁니다. 경고를 무시하려면 proguard-rules.pro 파일에 규칙을 추가합니다.

AGP 7.0에서는 누락된 클래스 메시지가 경고로 표시됩니다. gradle.propertiesandroid.r8.failOnMissingClasses = true를 설정하여 경고를 오류로 변환할 수 있습니다. AGP 8.0에서는 이러한 경고가 빌드를 손상시키는 오류가 됩니다. proguard-rules.pro 파일에 -ignorewarnings 옵션을 추가하여 AGP 7.0 동작을 유지할 수 있지만, 이는 권장되지 않습니다.

Android Gradle 플러그인 빌드 캐시 삭제됨

AGP 빌드 캐시는 AGP 4.1에서 삭제되었습니다. 이전에 AGP 2.3에서 Gradle 빌드 캐시를 보완하기 위해 도입된 AGP 빌드 캐시가 AGP 4.1에서는 Gradle 빌드 캐시로 완전히 대체되었습니다. 이 변경사항은 빌드 시간에 영향을 주지 않습니다.

AGP 7.0에서는 android.enableBuildCache 속성, android.buildCacheDir 속성, cleanBuildCache 작업이 삭제되었습니다.

프로젝트에서 자바 11 소스 코드 사용

이제 앱 프로젝트에서 최대 Java 11 소스 코드를 컴파일하고 비공개 인터페이스 메서드, 익명 클래스의 diamond 연산자, 람다 매개변수의 로컬 변수 문법과 같은 최신 언어 기능을 사용할 수 있습니다.

이 기능을 사용하려면 compileOptions를 원하는 Java 버전으로 설정하고 compileSdkVersion을 30 이상으로 설정하세요.

// build.gradle
android {
  compileSdkVersion 30
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_11
    targetCompatibility JavaVersion.VERSION_11
  }
  // For Kotlin projects
  kotlinOptions {
    jvmTarget = "11"
  }
}
// build.gradle.kts
android {
  compileSdkVersion(30)
  compileOptions {
    sourceCompatibility(JavaVersion.VERSION_11)
    targetCompatibility(JavaVersion.VERSION_11)
  }
  kotlinOptions {
    jvmTarget = "11"
  }
}

종속 항목 구성 삭제됨

AGP 7.0에서는 다음 구성 (또는 종속 항목 범위)이 삭제되었습니다.

  • compile
    사용 사례에 따라 api 또는 implementation로 대체되었습니다.
    *Compile 변형(예: debugCompile)에도 적용됩니다.
  • provided
    compileOnly로 대체되었습니다.
    *Provided 변형(예: releaseProvided)에도 적용됩니다.
  • apk
    runtimeOnly로 대체되었습니다.
  • publish
    runtimeOnly로 대체되었습니다.

대부분의 경우 AGP 업그레이드 어시스턴트에서는 새 구성으로 프로젝트를 자동으로 이전합니다.

Android Gradle 플러그인에서 컴파일할 때 클래스 경로 변경

Android Gradle 플러그인에서 컴파일하는 경우 컴파일 클래스 경로가 변경될 수 있습니다. 이제 AGP가 내부적으로 api/implementation 구성을 사용하므로 컴파일 클래스 경로에서 일부 아티팩트가 삭제될 수 있습니다. 컴파일 시간에 AGP 종속 항목을 사용하는 경우 이를 명시적인 종속 항목으로 추가해야 합니다.

자바 리소스 폴더에 네이티브 라이브러리 추가는 지원되지 않음

이전에는 네이티브 라이브러리를 자바 리소스 폴더에 추가하고 android.sourceSets.main.resources.srcDirs 로 폴더를 등록하여 네이티브 라이브러리를 추출하고 최종 APK에 추가할 수 있었습니다. 이는 AGP 7.0부터 지원되지 않으며 자바 리소스 폴더의 네이티브 라이브러리는 무시됩니다. 대신 네이티브 라이브러리용 DSL 메서드인 android.sourceSets.main.jniLibs.srcDirs를 사용하세요. 자세한 내용은 소스 세트 구성 방법을 참고하세요.

알려진 문제

이 섹션에서는 Android Gradle 플러그인 7.0.0에서 발생한 알려진 문제에 관해 설명합니다.

1.4.x Kotlin 다중 플랫폼 플러그인과의 비호환성

Android Gradle 플러그인 7.0.0은 Kotlin 멀티플랫폼 플러그인 1.5.0 이상과 호환됩니다. Android Gradle 플러그인 7.0.0을 사용하려면 Kotlin 멀티플랫폼 지원을 사용하는 프로젝트를 Kotlin 1.5.0으로 업데이트해야 합니다. 한 가지 해결 방법으로, Android Gradle 플러그인을 4.2.x로 다운그레이드할 수 있지만 이는 권장되지 않습니다.

자세한 내용은 KT-43944를 참고하세요.

린트 출력 누락

린트 작업이 최신 상태일 때 stdout에 린트 텍스트 출력이 표시되지 않습니다(문제 #191897708). 자세한 내용은 린트의 동작 변경사항을 참고하세요. 이 문제는 Android Gradle 플러그인 7.1에서 해결될 예정입니다.

일부 동적 기능 라이브러리 종속 항목이 린트 검사되지 않음

앱 모듈에서 checkDependencies = true인 상태에서 린트를 실행할 경우 동적 기능 라이브러리 종속 항목은 동시에 앱 종속 항목이 아닌 한, 검사되지 않습니다. (문제 #191977888) 이 문제를 해결하려면 린트 작업을 동적 기능 라이브러리에서 실행하면 됩니다. 자세한 내용은 린트의 동작 변경사항을 참고하세요.