Android Gradle 플러그인 4.1.0(2020년 8월)

호환성

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

<p>This version of the Android plugin requires the following:</p>
<ul>
  <li>
    <p><a href="https://docs.gradle.org/6.5.1/release-notes.html">Gradle 6.5</a>.
    To learn more, read the section about <a href="#updating-gradle">updating
    Gradle</a>.</p>
  </li>
  <li>
    <p><a href="/studio/releases/build-tools.html#notes">SDK Build Tools
    29.0.2</a> or higher.</p>
  </li>
</ul>
<p>The default NDK version in this release is 21.1.6352462. To install a
different NDK version, see <a href="/studio/projects/install-ndk#specific-version">Install a specific version of the NDK</a>.</p>

새로운 기능

이 버전의 Android Gradle 플러그인에는 다음과 같은 새로운 기능이 포함됩니다.

Kotlin 스크립트 DSL 지원

Kotlin 빌드스크립트 사용자의 편집 환경을 개선하기 위해 이제 Android Gradle 플러그인 4.1의 DSL 및 API가 구현 클래스와 별도로 Kotlin 인터페이스에서 정의됩니다. 이 내용의 의미는 다음과 같습니다.

  • 이제 Kotlin 유형과 관련해 null 허용 여부 및 변경 가능성이 명시적으로 선언됩니다.
  • 이러한 인터페이스에서 생성된 문서는 Kotlin API 참조에 게시됩니다.
  • Android Gradle 플러그인의 API 노출 영역이 명확히 정의되므로, 앞으로 Android 빌드를 보다 안정되게 확장할 수 있습니다.

중요: 이미 KTS 빌드 스크립트를 채택했거나 buildSrc에서 Kotlin을 사용하는 경우 이전 출시에서 매니페스트를 런타임 오류로 갖는 특정 오류로 인해 소스 호환성이 손상될 수 있습니다.

DSL에서 변경되도록 설계된 컬렉션 유형은 이제 일률적으로 다음과 같이 정의됩니다.

val collection: MutableCollectionType

즉, 이전에는 가능했지만 이제는 일부 컬렉션의 경우 Kotlin 스크립트에 다음을 작성할 수 없습니다.

collection = collectionTypeOf(...)

그러나 컬렉션 변형이 일률적으로 지원되므로 이제 collection += …collection.add(...)가 모든 위치에서 작동합니다.

Android Gradle 플러그인 Kotlin API 및 DSL을 사용하는 프로젝트를 업그레이드할 때 문제가 발견되면 버그를 신고하세요.

AAR에서 C/C++ 종속 항목 내보내기

Android Gradle 플러그인 4.0에는 AAR 종속 항목에서 Prefab 패키지를 가져오는 기능이 추가되었습니다. AGP 4.1에서는 이제 Android 라이브러리 프로젝트의 AAR에 있는 외부 네이티브 빌드에서 라이브러리를 내보낼 수 있습니다.

네이티브 라이브러리를 내보내려면 라이브러리 프로젝트 build.gradle 파일의 android 블록에 다음을 추가하세요.

buildFeatures {
    prefabPublishing true
}

prefab { <var>mylibrary</var&;gt { headers "src/main/cpp/<var>mylibrary</var>/include" }

<var>myotherlibrary</var> {
    headers "src/main/cpp/<var>myotherlibrary</var>/include"
}

}

buildFeatures {
    prefabPublishing = true
}

prefab { create("<var>mylibrary</var>") { headers = "src/main/cpp/<var>mylibrary</var>/include" }

create("<var>myotherlibrary</var>") {
    headers = "src/main/cpp/<var>myotherlibrary</var>/include"
}

}

이 예에서 ndk-build 또는 CMake 외부 네이티브 빌드의 mylibrarymyotherlibrary 라이브러리는 빌드에서 생성된 AAR에 패키징되며 각각은 지정된 디렉터리의 헤더를 종속 디렉터리로 내보냅니다.

참고: Android Gradle 플러그인 4.0 이상 사용자의 경우 사전 빌드된 네이티브 라이브러리를 가져오기 위한 구성 설정이 변경되었습니다. 자세한 내용은 4.0 출시 노트를 참고하세요.

Kotlin 메타데이터에 대한 R8 지원

Kotlin은 자바 클래스 파일의 맞춤 메타데이터를 사용하여 Kotlin 언어 구성을 식별합니다. 이제 R8은 kotlin-reflect를 사용한 Kotlin 라이브러리 및 애플리케이션의 축소를 완벽하게 지원하기 위해 Kotlin 메타데이터 유지관리 및 재작성을 지원합니다.

Kotlin 메타데이터를 보관하려면 다음 keep 규칙을 추가하세요.

-keep class kotlin.Metadata { *; }

-keepattributes RuntimeVisibleAnnotations

그러면 직접 보관되는 모든 클래스의 Kotlin 메타데이터를 보관하라는 지시가 R8에 전달됩니다.

자세한 내용은 Medium에서 R8로 Kotlin 반전을 사용하여 Kotlin 라이브러리 및 애플리케이션 축소{:.external}를 참고하세요.

디버그 빌드의 어설션

Android Gradle 플러그인 4.1.0 이상을 사용하여 앱의 디버그 버전을 빌드하면 내장 컴파일러(D8)에서 앱 코드를 다시 작성하여 컴파일 시 어설션을 사용 설정하므로 어설션 검사가 항상 활성 상태입니다.

동작 변경사항

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

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

cleanBuildCache 작업과 android.enableBuildCacheandroid.buildCacheDir 속성은 지원 중단되었으며 AGP 7.0에서 삭제될 예정입니다. 현재 android.enableBuildCache 속성은 아무런 기능도 하지 않지만, android.buildCacheDir 속성 및 cleanBuildCache 작업은 AGP 7.0까지 기존 AGP 빌드 캐시 콘텐츠를 삭제하는 용도로 사용할 수 있습니다.

코드 축소를 사용하는 앱의 크기가 현저하게 감소함

이 버전부터 R 클래스의 필드가 기본적으로 더 이상 유지되지 않으므로 코드 축소를 사용 설정하는 앱의 APK 크기가 크게 줄어들 수 있습니다. 반전으로 R 클래스에 액세스하지 않는 한 동작 변경이 발생하지 않습니다. R 클래스에 액세스하는 경우 R 클래스에 keep 규칙을 추가해야 합니다.

android.namespacedRClass 속성의 이름이 android.nonTransitiveRClass로 바뀜

실험용 플래그 android.namespacedRClass의 이름이 android.nonTransitiveRClass로 바뀌었습니다.

gradle.properties 파일에 설정된 이 플래그는 라이브러리의 R 클래스에 라이브러리 자체에 선언된 리소스만 포함하고 라이브러리의 종속 항목은 포함하지 않도록 각 라이브러리 R 클래스의 네임스페이스 지정을 사용 설정합니다. 따라서, 해당 라이브러리의 R 클래스 크기가 감소합니다.

Kotlin DSL: coreLibraryDesugaringEnabled의 이름이 바뀜

Kotlin DSL 컴파일 옵션 coreLibraryDesugaringEnabledisCoreLibraryDesugaringEnabled로 변경되었습니다. 이 플래그에 관한 자세한 내용은 자바 8+ API 디슈가링 지원(Android Gradle 플러그인 4.0.0 이상)을 참고하세요.

라이브러리 프로젝트의 BuildConfig 클래스에서 버전 속성이 삭제됨

라이브러리 프로젝트에 한해, 생성된 BuildConfig 클래스에서 BuildConfig.VERSION_NAMEBuildConfig.VERSION_CODE 속성이 삭제되었습니다. 이러한 정적 값이 애플리케이션 버전 코드의 최종 값과 이름을 반영하지 않아 혼동을 야기했기 때문입니다. 또한 이러한 값은 매니페스트 병합 중에 삭제되었습니다.

향후 버전의 Android Gradle 플러그인에서는 versionNameversionCode 속성도 라이브러리의 DSL에서 삭제될 예정입니다. 현재 라이브러리 하위 프로젝트에서 앱 버전 코드/이름에 자동으로 액세스할 수 있는 방법은 없습니다.

애플리케이션 모듈은 아무것도 변경되지 않았기 때문에 계속해서 DSL에서 versionCodeversionName에 값을 할당할 수 있습니다. 이러한 값은 앱의 매니페스트 및 BuildConfig 필드에 전파됩니다.

NDK 경로 설정

모듈의 build.gradle 파일에서 android.ndkPath 속성을 사용하여 로컬 NDK 설치 경로를 설정할 수 있습니다.


android {
  ndkPath "your-custom-ndk-path"
}

android {
  ndkPath = "your-custom-ndk-path"
}

이 속성을 android.ndkVersion 속성과 함께 사용할 경우 이 경로에는 android.ndkVersion과 일치하는 NDK 버전이 포함되어야 합니다.

라이브러리 단위 테스트 동작 변경사항

라이브러리 단위 테스트의 컴파일 및 실행 방식의 동작이 변경되었습니다. 이제 라이브러리의 단위 테스트가 컴파일된 다음 라이브러리 자체의 컴파일/런타임 클래스에 실행됩니다. 그 결과 단위 테스트 시 외부 하위 프로젝트와 동일한 방식으로 라이브러리가 사용됩니다. 대개 이 구성에서는 테스트 결과가 향상됩니다.

경우에 따라 데이터 결합을 사용하는 라이브러리 단위 테스트에서 DataBindingComponent 또는 BR 클래스가 누락될 수 있습니다. 이러한 테스트는 androidTest 프로젝트에서 계측 테스트로 포트해야 합니다. 단위 테스트에서 이러한 클래스를 컴파일하고 실행하면 잘못된 결과가 발생할 수 있기 때문입니다.

io.fabric Gradle 플러그인 지원 중단됨

io.fabric Gradle 플러그인이 지원 중단되었으며 Android Gradle 플러그인의 버전 4.1과 호환되지 않습니다. 지원 중단된 Fabric SDK 및 Firebase Crashlytics SDK로의 이전에 관한 자세한 내용은 Firebase Crashlytics SDK로 업그레이드를 참고하세요.