Google은 흑인 공동체를 위한 인종 간 평등을 진전시키기 위해 노력하고 있습니다. Google에서 어떤 노력을 하고 있는지 확인하세요.

Android Gradle 플러그인 출시 노트

Android 스튜디오 빌드 시스템은 Gradle을 기반으로 하며 Android Gradle 플러그인에는 Android 앱을 빌드하는 데 사용하는 몇 가지 추가 기능이 있습니다. Android 플러그인은 일반적으로 Android 스튜디오와 완전히 동기화되어 업데이트되지만, 나머지 Gradle 시스템과 함께 Android 스튜디오로부터 독립적으로 실행되고 별도로 업데이트될 수 있습니다.

이 페이지에는 Gradle 도구를 업데이트하는 방법과 최근 업데이트 내용이 설명되어 있습니다.

Gradle을 사용하여 Android 빌드를 구성하는 방법에 관한 자세한 내용은 다음 페이지를 참조하세요.

Gradle 빌드 시스템에 관한 자세한 내용은 Gradle 사용자 가이드를 참조하세요.

Android Gradle 플러그인 업데이트

Android 스튜디오를 업데이트하면 Android Gradle 플러그인을 사용 가능한 최신 버전으로 자동 업데이트하라는 메시지가 표시될 수 있습니다. 업데이트를 수락하거나 프로젝트의 빌드 요구사항에 따라 버전을 수동으로 지정할 수 있습니다.

Android 스튜디오의 File > Project Structure > Project 메뉴 또는 최상위 build.gradle 파일에서 플러그인 버전을 지정할 수 있습니다. 플러그인 버전은 Android 스튜디오 프로젝트에 빌드된 모든 모듈에 적용됩니다. 다음 예는 build.gradle 파일에서 플러그인을 버전 4.0.0으로 설정합니다.

buildscript {
    repositories {
        // Gradle 4.1 and higher include support for Google's Maven repo using
        // the google() method. And you need to include this repo to download
        // Android Gradle plugin 3.0.0 or higher.
        google()
        ...
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:4.0.0'
    }
}

주의: 버전 번호에 동적 종속 항목을 사용해서는 안 됩니다(예: 'com.android.tools.build:gradle:2.+'). 이 기능을 사용하면 예상하지 못한 버전 업데이트가 발생할 수 있고 버전 차이를 확인하기 어려울 수 있습니다.

지정된 플러그인 버전을 다운로드하지 않은 경우, 다음에 프로젝트를 빌드할 때 또는 Android 스튜디오 메뉴 바에서 Tools > Android > Sync Project with Gradle Files를 클릭하면 Gradle에서 플러그인 버전을 다운로드합니다.

Gradle 업데이트

Android 스튜디오를 업데이트하면 Gradle 또한 사용 가능한 최신 버전으로 업데이트하라는 메시지가 표시될 수 있습니다. 업데이트를 수락하거나 프로젝트의 빌드 요구사항에 따라 버전을 수동으로 지정할 수 있습니다.

다음 표는 각 버전의 Android Gradle 플러그인에 필요한 Gradle 버전을 보여줍니다. 최상의 성능을 위해서는 Gradle과 플러그인을 가능한 최신 버전으로 사용해야 합니다.

플러그인 버전필요한 Gradle 버전
1.0.0~1.1.32.2.1~2.3
1.2.0~1.3.12.2.1~2.9
1.5.02.2.1~2.13
2.0.0~2.1.22.10~2.13
2.1.3~2.2.32.14.1+
2.3.0+3.3+
3.0.0+4.1+
3.1.0+4.4+
3.2.0~3.2.14.6+
3.3.0~3.3.34.10.1+
3.4.0~3.4.35.1.1+
3.5.0~3.5.45.4.1+
3.6.0~3.6.45.6.4+
4.0.0+6.1.1+
4.1.0+6.5+

Android 스튜디오의 File > Project Structure > Project 메뉴에서 또는 gradle/wrapper/gradle-wrapper.properties 파일의 Gradle 배포 참조를 편집하여 Gradle 버전을 지정할 수 있습니다. 다음 예는 gradle-wrapper.properties 파일에서 Gradle 버전을 6.1.1로 설정합니다.

...
distributionUrl = https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
...

4.1.0(2020년 8월)

호환성

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

새로운 기능

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

Kotlin 스크립트 DSL 지원

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

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

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 {
    mylibrary {
      headers "src/main/cpp/mylibrary/include"
    }

    myotherlibrary {
        headers "src/main/cpp/myotherlibrary/include"
    }
}

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

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

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

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

-keep class kotlin.Metadata { *; }

-keepattributes RuntimeVisibleAnnotations

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

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

디버그 빌드의 어설션

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

동작 변경사항

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

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

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

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

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

Kotlin DSL: coreLibraryDesugaringEnabled의 이름이 바뀜

Kotlin DSL 컴파일 옵션 coreLibraryDesugaringEnabledisCoreLibraryDesugaringEnabled로 변경되었습니다.

라이브러리 프로젝트의 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.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로 업그레이드를 참조하세요.

4.0.0(2020년 4월)

이 버전의 Android 플러그인에는 다음이 필요합니다.

4.0.1(2020년 7월)

이번 소규모 업데이트에서는 Android 11의 패키지 공개 상태와 관련된 새로운 기본 설정 및 기능과의 호환성을 지원합니다.

이전 버전의 Android에서는 기기에 설치된 모든 앱의 목록을 확인할 수 있었습니다. Android 11(API 수준 30)부터 앱은 설치된 패키지의 필터링된 목록에만 기본적으로 액세스할 수 있습니다. 시스템에서 더 포괄적인 앱 목록을 보려면 앱 또는 라이브러리의 Android 매니페스트에서 <queries> 요소를 추가해야 합니다.

Android Gradle 플러그인 4.1 이상은 이미 새로운 <queries> 선언과 호환됩니다. 하지만 이전 버전은 호환되지 않습니다. <queries> 요소를 추가하거나 Android 11 타겟팅을 지원하는 라이브러리 또는 SDK를 사용하기 시작하면 앱을 빌드할 때 매니페스트 병합 오류가 발생할 수 있습니다.

이 문제를 해결하기 위해 AGP 3.3 이상을 위한 패치를 내놓고 있습니다. AGP의 이전 버전을 사용하는 경우 다음 버전 중 하나로 업그레이드합니다.

다음 AGP 버전을
사용 중인 경우...
다음으로 업그레이드
4.0.* 4.0.1
3.6.* 3.6.4
3.5.* 3.5.4
3.4.* 3.4.3
3.3.* 3.3.3

이 새로운 기능에 관한 자세한 내용은 Android 11의 패키지 공개 상태를 참조하세요.

새로운 기능

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

Android 스튜디오 빌드 분석 도구 지원

빌드 분석 도구 창을 통해 최적화 장애, 부적절하게 구성된 작업 등의 빌드 프로세스 관련 문제를 파악하고 진단할 수 있습니다. 이 기능은 Android Gradle 플러그인 4.0.0 이상이 설치된 Android 스튜디오 4.0 이상에서 사용할 수 있습니다. 빌드 분석 도구 창은 다음과 같이 Android 스튜디오에서 열 수 있습니다.

  1. 앱을 아직 빌드하지 않은 경우 메뉴 바에서 Build > Make Project를 선택하여 앱을 빌드합니다.
  2. 메뉴 바에서 View > Tool Windows > Build를 선택합니다.
  3. Build 창에서 다음 방법 중 하나를 사용하여 Build Analyzer 창을 엽니다.
    • Android 스튜디오에서 프로젝트 빌드를 완료하면 Build Analyzer 탭을 클릭합니다.
    • Android 스튜디오에서 프로젝트 빌드를 완료하면 Build Output 창의 오른쪽에 있는 링크를 클릭합니다.

발생 가능한 빌드 문제는 Build Analyzer 창의 왼쪽 트리에 정리됩니다. 각 문제를 검사하고 클릭하면 오른쪽 패널에서 세부정보를 조사할 수 있습니다. Android 스튜디오는 빌드를 분석할 때 빌드 기간을 결정하는 작업 집합을 계산하고 각 작업의 영향을 파악할 수 있도록 시각화합니다. Warning 노드를 확장하여 경고의 세부정보를 가져올 수도 있습니다.

자세한 내용은 빌드 속도 회귀 식별을 참조하세요.

D8 및 R8의 자바 8 라이브러리 디슈가링

이제 Android Gradle 플러그인에서는 앱의 최소 API 수준 없이 다양한 자바 8 언어 API를 사용할 수 있도록 지원합니다.

DEX 컴파일러인 D8은 디슈가링이라는 프로세스를 통해 이미 Android 스튜디오 3.0 이상에서 자바 8 언어 기능을 위한 많은 지원(람다 식, 기본 인터페이스 메서드, try with resources 등)을 하고 있습니다. Android 스튜디오 4.0에서는 자바 언어 API를 디슈가링할 수 있도록 디슈가링 엔진이 확장되었습니다. 즉, 최신 Android 릴리스(java.util.streams 등)에서만 사용할 수 있었던 표준 언어 API를 Android 이전 버전을 지원하는 앱에 포함할 수 있습니다.

이번 버전에서는 다음의 API 집합이 지원됩니다.

  • 순차적 스트림(java.util.stream)
  • java.time의 하위 집합
  • java.util.function
  • 최근 java.util.{Map,Collection,Comparator}에 추가된 사항
  • 선택사항(java.util.Optional, java.util.OptionalIntjava.util.OptionalDouble)과 위의 API에서 유용하게 사용할 수 있는 몇 가지 새로운 클래스
  • 일부 java.util.concurrent.atomic에 추가된 사항(AtomicInteger, AtomicLong, AtomicReference의 새 메서드)
  • ConcurrentHashMap(Android 5.0 버그 수정 포함)

이러한 언어 API를 지원하기 위해 D8에서는 누락된 API의 구현을 포함하는 별도의 라이브러리 DEX 파일을 컴파일하고 앱에 포함합니다. 디슈가링 프로세스를 사용하면 앱 코드를 다시 작성하여 런타임에 이 라이브러리를 대신 사용할 수 있습니다.

이러한 언어 API를 지원하려면 모듈의 build.gradle 파일에 다음을 포함하세요.

android {
  defaultConfig {
    // Required when setting minSdkVersion to 20 or lower
    multiDexEnabled true
  }

  compileOptions {
    // Flag to enable support for the new language APIs
    coreLibraryDesugaringEnabled true
    // Sets Java compatibility to Java 8
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

dependencies {
  coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.4'
}

빌드 기능을 사용 설정 또는 사용 중지할 수 있는 새로운 옵션

Android Gradle 플러그인 4.0.0에는 뷰 바인딩과 데이터 결합과 같은 사용 설정하거나 중지할 빌드 기능을 제어할 수 있는 새로운 방법이 도입되었습니다. 새로 추가된 기능은 기본적으로 사용 중지됩니다. 이후에 buildFeatures 차단 기능을 사용하여 원하는 기능만 사용하여 프로젝트의 빌드 성능을 최적화할 수 있습니다. 다음과 같이 모듈 수준의 build.gradle 파일에 있는 각 모듈의 옵션을 설정할 수 있습니다.

android {
    // The default value for each feature is shown below. You can change the value to
    // override the default behavior.
    buildFeatures {
        // Determines whether to generate a BuildConfig class.
        buildConfig = true
        // Determines whether to support View Binding.
        // Note that the viewBinding.enabled property is now deprecated.
        viewBinding = false
        // Determines whether to support Data Binding.
        // Note that the dataBinding.enabled property is now deprecated.
        dataBinding = false
        // Determines whether to generate binder classes for your AIDL files.
        aidl = true
        // Determines whether to support RenderScript.
        renderScript = true
        // Determines whether to support injecting custom variables into the module’s R class.
        resValues = true
        // Determines whether to support shader AOT compilation.
        shaders = true
    }
}

다음과 같이 프로젝트의 gradle.properties 파일에 다음 중 하나 이상을 포함하면 프로젝트의 모든 모듈에서 이러한 기능의 기본 설정을 지정할 수도 있습니다. 이 경우에도 모듈 수준의 build.gradle 파일에 있는 buildFeatures 블록을 사용하여 프로젝트 전체의 기본 설정을 재정의할 수 있습니다.

android.defaults.buildfeatures.buildconfig=true
android.defaults.buildfeatures.aidl=true
android.defaults.buildfeatures.renderscript=true
android.defaults.buildfeatures.resvalues=true
android.defaults.buildfeatures.shaders=true

기능별 종속 항목

이전 버전의 Android Gradle 플러그인에서는 모든 기능 모듈이 앱의 기본 모듈에만 종속될 수 있었습니다. 이제 Android Gradle 플러그인 4.0.0을 사용하여 다른 기능 모듈에 종속되는 기능 모듈을 포함할 수 있습니다. 즉, 아래 그림과 같이 :video 기능은 기본 모듈에 종속되는 :camera 기능에 종속될 수 있습니다.

기능별 종속 항목

기능 모듈 :video은 기본 :app 모듈에 종속되는 기능 :camera에 종속됩니다.

즉, 앱에서 기능 모듈을 다운로드하도록 요청하면 종속된 다른 기능 모듈도 다운로드됩니다. 앱에 기능 모듈을 생성한 후 모듈의 build.gradle 파일에 기능별 종속 항목을 선언할 수 있습니다. 예를 들면 :video 모듈은 다음과 같이 :camera에 관한 종속 항목을 선언합니다.

// In the build.gradle file of the ':video' module.
dependencies {
    // All feature modules must declare a dependency
    // on the base module.
    implementation project(':app')
    // Declares that this module also depends on the 'camera'
    // feature module.
    implementation project(':camera')
    ...
}

또한 Android 스튜디오의 기능별 종속 항목 기능을 사용 설정하여 실행 구성을 수정할 때 기능을 지원해야 합니다. 이렇게 하려면 메뉴 바에서 Help > Edit Custom VM Options를 클릭하고 다음 내용을 포함합니다.

-Drundebug.feature.on.feature=true

종속 항목 메타데이터

Android Gradle 플러그인 4.0.0 이상을 사용하여 앱을 빌드할 때 플러그인에는 앱에 컴파일되는 종속 항목을 설명하는 메타데이터가 포함되어 있습니다. 앱을 업로드할 때 Play Console은 이 메타데이터를 검사하여 다음과 같은 이점을 제공합니다.

  • 앱에서 사용하는 SDK 및 종속 항목의 알려진 문제에 관한 알림 받기
  • 문제 해결을 위한 실행 가능한 피드백 받기

데이터는 압축되고 Google Play 서명 키에 의해 암호화되며 출시 앱의 서명 블록에 저장됩니다. 그러나 로컬 중간 빌드 파일에서 <project>/<module>/build/outputs/sdk-dependencies/release/sdkDependency.txt 디렉터리의 메타데이터를 직접 검사할 수 있습니다.

이 정보를 공유하지 않으려면 모듈의 build.gradle 파일에 다음을 포함하여 선택 해제할 수 있습니다.

android {
    dependenciesInfo {
        // Disables dependency metadata when building APKs.
        includeInApk = false
        // Disables dependency metadata when building Android App Bundles.
        includeInBundle = false
    }
}

AAR 종속 항목에서 네이티브 라이브러리 가져오기

이제 앱의 AAR 종속 항목에서 C/C++ 라이브러리를 가져올 수 있습니다. 아래에 나온 구성 단계를 따르면 Gradle에서 자동으로 이러한 네이티브 라이브러리를 CMake와 같은 외부 네이티브 빌드 시스템에서 사용 가능하도록 합니다. Gradle은 이러한 라이브러리를 빌드에 사용할 수 있도록 할 뿐이며, 개발자는 라이브러리를 사용하도록 빌드 스크립트를 구성해야 합니다.

라이브러리는 Prefab 패키지 형식을 사용하여 내보내집니다.

각 종속 항목은 하나 이상의 모듈로 구성된 Prefab 패키지를 최대 한 개까지 노출할 수 있습니다. Prefab 모듈은 단일 라이브러리로서 공유, 정적 또는 헤더 전용 라이브러리일 수 있습니다.

일반적으로 패키지 이름은 Maven 아티팩트 이름과 일치하고 모듈 이름은 라이브러리 이름과 일치하지만 항상 그렇지는 않습니다. 라이브러리의 패키지 및 모듈 이름을 알아야 하므로 종속 항목 설명서를 참조하여 이름이 무엇인지 확인해야 할 수도 있습니다.

외부 네이티브 빌드 시스템 구성

따라야 할 단계를 보려면 사용하려는 외부 네이티브 빌드 시스템을 클릭합니다.

AAR에 포함된 네이티브 종속 항목은 CMAKE_FIND_ROOT_PATH 변수를 통해 CMake 프로젝트에 노출됩니다. 이 값은 CMake 호출 시 Gradle에 의해 자동으로 설정되므로, 빌드 시스템이 이 변수를 수정하는 경우 변수에 할당하지 말고 추가해야 합니다.

각 종속 항목은 config-file 패키지를 CMake 빌드에 노출하며, 이 패키지는 find_package 명령어를 사용하여 가져옵니다. 이 명령어는 지정된 패키지 이름 및 버전과 일치하는 config-file 패키지를 검색하여 정의하는 타겟을 빌드에서 사용되도록 노출합니다. 예를 들어, 애플리케이션에서 libapp.so를 정의하고 curl을 사용한다면, CMakeLists.txt 파일에 다음을 포함해야 합니다.

add_library(app SHARED app.cpp)

# Add these two lines.
find_package(curl REQUIRED CONFIG)
target_link_libraries(app curl::curl)

이제 app.cpp에서 #include "curl/curl.h"를 지정할 수 있습니다. 프로젝트를 빌드하면 외부 네이티브 빌드 시스템이 APK 또는 App Bundle의 libcurl.so 및 패키지 libcurl.so에 관해 libapp.so를 자동으로 연결합니다. 자세한 내용은 curl prefab 샘플을 참조하세요.

동작 변경사항

이 버전의 플러그인을 사용하면 동작에 다음과 같은 변경사항이 나타납니다.

Android Gradle의 '기능' 및 'instantapp' 플러그인 삭제

Android Gradle 플러그인 3.6.0에서는 동적 기능 플러그인(com.android.dynamic-feature)을 사용하여 Android App Bundle을 사용하는 인스턴트 앱을 빌드하고 패키징할 수 있도록 기능 플러그인(com.android.feature)과 인스턴트 앱 플러그인(com.android.instantapp)이 지원 중단되었습니다.

Android Gradle 플러그인 4.0.0 이상에서는 지원 중단된 플러그인이 완전히 삭제됩니다. 따라서 최신 Android Gradle 플러그인을 사용하려면 Android App Bundle을 지원할 수 있도록 인스턴트 앱을 이전해야 합니다. 인스턴트 앱을 이전하면 App Bundle의 이점을 활용하고 앱의 모듈형 디자인을 간소화할 수 있습니다.

별도의 주석 처리 기능 삭제됨

주석 처리를 전용 작업으로 분리하는 기능을 삭제하였습니다. 이 옵션은 자바 전용 프로젝트에서 비증분 주석 프로세서를 사용한 경우 증분 자바 컴파일을 유지하는 데 사용되었으며 더 이상 사용할 수 없는 gradle.properties 파일의 android.enableSeparateAnnotationProcessingtrue로 설정하면 사용할 수 있었습니다.

대신 증분 주석 프로세서 사용으로 이전하여 빌드 성능을 개선해야 합니다.

includeCompileClasspath가 지원 중단됨

Android Gradle 플러그인은 이제 컴파일 클래스 경로에서 선언하는 주석 프로세서를 확인하거나 포함하지 않으며 annotationProcessorOptions.includeCompileClasspath DSL 속성이 더 이상 적용되지 않습니다. 컴파일 클래스 경로에 주석 프로세서를 포함하면 다음과 같은 오류가 발생할 수 있습니다.

Error: Annotation processors must be explicitly declared now.

이 문제를 해결하려면 annotationProcessor 종속 항목 구성을 사용하여 build.gradle 파일에 주석 프로세서를 포함해야 합니다. 자세한 내용은 주석 프로세서 추가를 참조하세요.

CMake에 사용되는 사전 빌드된 종속 항목의 자동 패키징

이전 버전의 Android Gradle 플러그인을 사용하려면 jniLibs을 사용하여 CMake 외부 네이티브 빌드에 사용된 사전 빌드 라이브러리를 명시적으로 패키징해야 했습니다. 모듈의 src/main/jniLibs 디렉터리 또는 build.gradle 파일에 구성된 다른 디렉터리에 라이브러리가 있을 수 있습니다.

sourceSets {
    main {
        // The libs directory contains prebuilt libraries that are used by the
        // app's library defined in CMakeLists.txt via an IMPORTED target.
        jniLibs.srcDirs = ['libs']
    }
}

Android Gradle 플러그인 4.0에서는 위 구성이 더 이상 필요하지 않으며 빌드 오류를 야기합니다.

* What went wrong:
Execution failed for task ':app:mergeDebugNativeLibs'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
   > More than one file was found with OS independent path 'lib/x86/libprebuilt.so'

이제 외부 네이티브 빌드가 이러한 라이브러리를 자동으로 패키징하므로 jniLibs를 사용하여 라이브러리를 명시적으로 패키징하면 중복이 발생하게 됩니다. 빌드 오류를 방지하려면 사전 빌드된 라이브러리를 jniLibs 외부 위치로 옮기거나 build.gradle 파일에서 jniLibs 구성을 삭제하세요.

알려진 문제

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

Gradle 작업자 메커니즘의 경합 상태

Android Gradle 플러그인 4.0의 변경으로 인해, --no-daemon과 Gradle 6.3 이하 버전을 사용하여 실행하면 Gradle에서 경합 상태가 발생할 수 있습니다. 이로 인해 빌드가 완료된 후 중단됩니다.

이 문제는 Gradle 6.4에서 해결될 예정입니다.

3.6.0(2020년 2월)

이 버전의 Android 플러그인에는 다음이 필요합니다.

3.6.4(2020년 7월)

이번 소규모 업데이트에서는 Android 11의 패키지 공개 상태와 관련된 새로운 기본 설정 및 기능과의 호환성을 지원합니다.

자세한 내용은 4.0.1 출시 노트를 참조하세요.

새로운 기능

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

뷰 바인딩

뷰 바인딩에서는 코드에서 뷰를 참조할 때 컴파일 시간 안전성을 제공합니다. 이제 findViewById()를 자동 생성된 바인딩 클래스 참조로 대체할 수 있습니다. 뷰 바인딩을 사용하려면 각 모듈의 build.gradle 파일에 다음을 포함하세요.

android {
    viewBinding.enabled = true
}

자세한 내용은 뷰 바인딩 문서를 참조하세요.

Maven Publish 플러그인 지원

Android Gradle 플러그인에는 빌드 아티팩트를 Apache Maven 저장소에 게시할 수 있는 Maven Publish Gradle 플러그인 지원 기능이 포함되어 있습니다. Android Gradle 플러그인에서는 Maven 저장소에 대한 게시를 맞춤설정하는 데 사용하는 앱 또는 라이브러리 모듈의 빌드 변형 아티팩트별 구성요소가 생성됩니다.

자세한 내용은 Maven Publish 플러그인 사용 방법에 관한 페이지를 참조하세요.

새로운 기본 패키징 도구

앱의 디버그 버전을 빌드할 때 플러그인은 zipflinger라는 새로운 패키징 도구를 사용하여 APK를 빌드합니다. 이 새로운 도구를 사용하면 빌드 속도가 향상됩니다. 새 패키징 도구가 제대로 작동하지 않으면 버그를 신고하세요. 다음을 gradle.properties 파일에 포함하면 이전 패키징 도구를 사용하도록 되돌릴 수 있습니다.

android.useNewApkCreator=false

네이티브 빌드 속성

이제 Clang이 프로젝트의 각 C/C++ 파일을 빌드하고 링크하는 데 걸리는 시간을 결정할 수 있습니다. Gradle은 이러한 컴파일러 이벤트의 타임스탬프를 포함하는 Chrome 추적 사항을 출력할 수 있으며 이에 따라 프로젝트를 빌드하는 데 필요한 시간을 더 잘 파악할 수 있습니다. 이 빌드 속성 파일을 출력하려면 다음 단계를 따르세요.

  1. Gradle 빌드를 실행할 때 -Pandroid.enableProfileJson=true 플래그를 추가합니다. 예:

    gradlew assembleDebug -Pandroid.enableProfileJson=true

  2. Chrome 브라우저를 열고 검색창에 chrome://tracing을 입력합니다.

  3. 로드 버튼을 클릭하고 project-root/build/android-profile로 이동하여 파일을 찾습니다. 파일 이름은 profile-timestamp.json.gz입니다.

뷰어 상단에서 네이티브 빌드 속성 데이터를 볼 수 있습니다.

Chrome의 네이티브 빌드 속성 추적

동작 변경사항

이 버전의 플러그인을 사용하면 동작에 다음과 같은 변경사항이 나타납니다.

네이티브 라이브러리가 기본적으로 압축되지 않고 패키징됨

앱을 빌드하면 기본적으로 플러그인이 extractNativeLibs"false"로 설정합니다. 즉 네이티브 라이브러리가 페이지 정렬되고 압축되지 않은 상태로 패키징됩니다. 이렇게 하면 업로드 크기는 커지지만 사용자에게 다음과 같은 장점이 있습니다.

  • 플랫폼이 라이브러리 사본을 생성하지 않고 설치된 APK에서 직접 네이티브 라이브러리에 액세스할 수 있기 때문에 앱 설치 크기가 더 작습니다.
  • APK 또는 Android App Bundle에 압축되지 않은 네이티브 라이브러리를 포함할 때 일반적으로 Play 스토어에서 압축이 더 많이 되므로 다운로드 크기가 더 작습니다.

패키지 압축 네이티브 라이브러리 대신 Android Gradle 플러그인을 사용하려면 앱 매니페스트에 다음을 포함하세요.

<application
    android:extractNativeLibs="true"
    ... >
</application>

기본 NDK 버전

여러 버전의 NDK를 다운로드하면 이제 Android Gradle 플러그인이 소스 코드 파일을 컴파일할 때 사용할 기본 버전을 선택합니다. 이전에는 플러그인이 가장 최근에 다운로드한 NDK 버전을 선택했습니다. 모듈의 build.gradle 파일에서 android.ndkVersion 속성을 사용하여 플러그인에서 선택한 기본값을 재정의합니다.

간소화된 R 클래스 생성

Android Gradle 플러그인은 프로젝트의 라이브러리 모듈마다 R 클래스 하나만 생성하고 이러한 R 클래스를 다른 모듈 종속 항목과 공유함으로써 컴파일 클래스 경로를 단순화합니다. 이렇게 최적화하면 빌드 속도는 빨라지지만 다음 사항에 유의해야 합니다.

  • 컴파일러가 업스트림 모듈 종속 항목과 R 클래스를 공유하므로 프로젝트에 포함된 각 모듈이 고유한 패키지 이름을 사용해야 합니다.
  • 라이브러리의 R 클래스가 다른 프로젝트 종속 항목에 보이는지 여부는 라이브러리를 종속 항목으로 포함하는 데 사용된 설정에 의해 결정됩니다. 예를 들어 A 라이브러리에 B 라이브러리가 'api' 종속 항목으로 포함되어 있으면 A 라이브러리 및 A 라이브러리에 종속된 다른 라이브러리는 B 라이브러리의 R 클래스에 액세스할 수 있습니다. 하지만 A 라이브러리가 implementation 종속 항목 설정을 사용할 경우 다른 라이브러리는 B 라이브러리의 R 클래스에 액세스할 수 없습니다. 자세한 내용은 종속 항목 구성을 참조하세요.

기본 설정에 없는 리소스 삭제

라이브러리 모듈의 경우 기본 리소스 세트에 포함하지 않은 언어의 리소스를 포함하면(예: /values-es/strings.xmlhello_world를 문자열 리소스로 포함하며 /values/strings.xml에 이 리소스를 정의하지 않음) Android Gradle 플러그인이 프로젝트를 컴파일할 때 더 이상 해당 리소스를 포함하지 않습니다. 이와 같이 작업을 변경하면서 Resource Not Found 런타임 예외가 줄었고 빌드 속도가 향상되었습니다.

이제 D8이 주석의 CLASS 보관 정책을 따름

앱을 컴파일할 때 이제 D8에서 주석이 CLASS 보관 정책을 적용할 시점을 따르며 이러한 주석은 더 이상 런타임 때는 사용할 수 없습니다. 이러한 동작은 앱의 타겟 SDK를 API 수준 23으로 설정할 때도 실시되며 이 작업은 Android Gradle 플러그인 및 D8의 오래된 버전을 사용하는 앱을 컴파일할 때 런타임 동안 이러한 주석에 액세스하도록 허용했었습니다.

기타 동작 변경사항

  • aaptOptions.noCompress는 모든 플랫폼에서 더 이상 대소문자를 구분하지 않으며(APK 및 번들 모두 해당) 대문자를 사용하는 경로를 우선 따릅니다.
  • 이제 데이터 결합이 기본적으로 증가합니다. 자세한 내용은 문제 #110061530을 참조하세요.
  • Roboelectric 단위 테스트를 포함한 모든 단위 테스트는 이제 완전히 캐시 가능합니다. 자세한 내용은 문제 #126775542를 참조하세요.

버그 수정

이 Android Gradle 플러그인 버전에서는 다음과 같은 버그가 수정되었습니다.

  • 이제 데이터 결합을 사용하는 라이브러리 모듈에서 Robolectric 단위 테스트가 지원됩니다. 자세한 내용은 문제 #126775542를 참조하세요.
  • 이제 Gradle의 동시 실행 모드가 사용 설정된 동안 여러 모듈에서 connectedAndroidTest 작업을 실행할 수 있습니다.

알려진 문제

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

Android Lint 작업의 성능 속도 저하

Android Lint가 일부 프로젝트에서 완료하는 데 훨씬 오래 걸릴 수 있습니다. 이는 파싱 인프라의 회귀 때문으로 특정 코드 구성의 람다 관련 추론된 형식의 계산이 느려집니다.

이 문제는 IDEA 버그로 신고되었으며 Android Gradle 플러그인 4.0에서 해결될 예정입니다.

매니페스트 클래스 누락

앱이 매니페스트에 맞춤 권한을 정의하면 Android Gradle 플러그인은 일반적으로 맞춤 권한을 문자열 상수로 포함하는 Manifest.java 클래스를 생성합니다. 플러그인은 이 클래스를 앱과 패키지로 구성하므로 런타임 시 이러한 권한을 더 쉽게 참조할 수 있습니다.

Android Gradle 플러그인 3.6.0에서 매니페스트 클래스 생성이 손상됩니다. 이 플러그인 버전으로 앱을 빌드하며 매니페스트 클래스를 참조한다면 ClassNotFoundException 예외가 표시됩니다. 이 문제를 해결하려면 다음 중 한 가지를 따르세요.

  • 정규화된 이름으로 맞춤 권한을 참조합니다. 예: "com.example.myapp.permission.DEADLY_ACTIVITY".
  • 아래와 같이 자체 상수를 정의합니다.

    public final class CustomPermissions {
      public static final class permission {
        public static final String DEADLY_ACTIVITY="com.example.myapp.permission.DEADLY_ACTIVITY";
      }
    

3.5.0(2019년 8월)

Android Gradle 플러그인 3.5.0은 Android 스튜디오 3.5와 함께 제공되는 주요 버전이며, Android 개발자 도구의 세 가지 주요 영역, 즉 시스템 상태, 기능 개선, 버그 수정을 개선하는 데 중점을 두는 Project Marble의 결과물입니다. 특히 이 업데이트에서는 주로 프로젝트 빌드 속도 개선에 중점을 두었습니다.

이 업데이트 및 기타 Project Marble 업데이트에 관한 내용은 Android 개발자 블로그 게시물 또는 아래 섹션을 참조하세요.

이 버전의 Android 플러그인에는 다음이 필요합니다.

3.5.4(2020년 7월)

이번 소규모 업데이트에서는 Android 11의 패키지 공개 상태와 관련된 새로운 기본 설정 및 기능과의 호환성을 지원합니다.

자세한 내용은 4.0.1 출시 노트를 참조하세요.

3.5.3(2019년 12월)

이번 소규모 업데이트는 Android 스튜디오 3.5.3을 지원하고 다양한 버그 수정 및 성능 개선을 포함합니다.

3.5.2(2019년 11월)

이번 소규모 업데이트는 Android 스튜디오 3.5.3을 지원하고 다양한 버그 수정 및 성능 개선을 포함합니다. 중요한 버그 수정 목록을 보려면 Release Updates 블로그에서 관련 게시물을 읽어보세요.

3.5.1(2019년 10월)

이번 소규모 업데이트는 Android 스튜디오 3.5.3을 지원하고 다양한 버그 수정 및 성능 개선을 포함합니다. 중요한 버그 수정 목록을 보려면 Release Updates 블로그에서 관련 게시물을 읽어보세요.

증분 주석 처리

gradle.properties 파일에 android.databinding.incremental=true를 설정한 경우 데이터 결합 주석 프로세서는 증분 주석 처리를 지원합니다. 이 최적화에 따라 증분 빌드 성능이 개선됩니다. 최적화된 주석 프로세서의 전체 목록은 증분 주석 프로세서 표를 참조하세요.

또한 KAPT 1.3.30 이상도 증분 주석 프로세서를 지원하며 이 프로세서는 gradle.properties 파일에 kapt.incremental.apt=true를 포함하여 사용 설정할 수 있습니다.

캐시 가능한 단위 테스트

Android 리소스, 애셋, 매니페스트를 사용하기 위해 includeAndroidResourcestrue로 설정하여 단위 테스트를 사용 설정하면 Android Gradle 플러그인에서 절대 경로가 포함된 테스트 구성 파일을 생성하며 이에 따라 캐시 재배치성이 손상됩니다. 대신 상대 경로를 사용하여 테스트 구성 파일을 생성하도록 플러그인에 지시할 수 있으며 이렇게 하면 gradle.properties 파일에 다음이 포함되어 AndroidUnitTest 작업이 완전히 캐시 가능하게 됩니다.

android.testConfig.useRelativePath = true

알려진 문제

  • Kotlin Gradle 플러그인 1.3.31 이하를 사용하는 경우 프로젝트를 빌드하거나 동기화할 때 다음과 같은 경고가 표시될 수 있습니다.

    WARNING: API 'variant.getPackageLibrary()' is obsolete and has been replaced
             with 'variant.getPackageLibraryProvider()'.
    

    이 문제를 해결하려면 플러그인을 버전 1.3.40 이상으로 업그레이드하세요.

3.4.0(2019년 4월)

이 버전의 Android 플러그인에는 다음이 필요합니다.

3.4.3(2020년 7월)

이번 소규모 업데이트에서는 Android 11의 패키지 공개 상태와 관련된 새로운 기본 설정 및 기능과의 호환성을 지원합니다.

자세한 내용은 4.0.1 출시 노트를 참조하세요.

3.4.2(2019년 7월)

이번 소규모 업데이트는 Android 스튜디오 3.5.3을 지원하고 다양한 버그 수정 및 성능 개선을 포함합니다. 중요한 버그 수정 목록을 보려면 Release Updates 블로그에서 관련 게시물을 읽어보세요.

3.4.1(2019년 5월)

이번 소규모 업데이트는 Android 스튜디오 3.5.3을 지원하고 다양한 버그 수정 및 성능 개선을 포함합니다. 중요한 버그 수정 목록을 보려면 Release Updates 블로그에서 관련 게시물을 읽어보세요.

새로운 기능

  • 새로운 린트 검사 종속 항목 구성: lintChecks 동작이 변경되고 새로운 종속 항목 구성인 lintPublish가 도입되어 Android 라이브러리에 어떤 린트 검사가 패키징되는지 더 효과적으로 제어할 수 있습니다.

    • lintChecks: 프로젝트를 로컬로 빌드할 때만 실행하려는 린트 검사에 사용해야 하는 기존 구성입니다. 이전에는 lintChecks 종속 항목 구성을 사용하여 게시된 AAR에 린트 검사를 포함했다면 종속 항목을 이전하여 아래에 설명된 새로운 lintPublish 구성을 대신 사용해야 합니다.
    • lintPublish: 게시된 AAR에 포함하려는 린트 검사를 위해 다음과 같이 라이브러리 프로젝트에서 이 새로운 구성을 사용합니다. 라이브러리를 사용하는 프로젝트도 린트 검사를 적용하게 됩니다.

    다음 코드 샘플은 로컬 Android 라이브러리 프로젝트에서 두 가지 종속 항목 구성을 모두 사용합니다.

    dependencies {
      // Executes lint checks from the ':lint' project at build time.
      lintChecks project(':lint')
      // Packages lint checks from the ':lintpublish' in the published AAR.
      lintPublish project(':lintpublish')
    }
    
  • 일반적으로 패키징 및 서명 작업의 전반적인 빌드 속도가 개선됩니다. 이러한 작업과 관련하여 성능 저하를 발견한 경우 버그를 신고하세요.

동작 변경사항

  • Android 인스턴트 앱의 플러그인 지원 중단 경고 기능: 인스턴트 앱 빌드를 위해 com.android.feature 플러그인을 여전히 사용하고 있다면 Android Gradle 플러그인 3.4.0이 지원 중단 경고를 보냅니다. 이후 버전의 플러그인에서 인스턴트 앱을 계속 빌드할 수 있도록 하려면 단일 Android App Bundle에서 설치된 앱 환경과 인스턴트 앱 환경 두 가지를 모두 게시할 수 있는 동적 기능 플러그인을 사용하여 인스턴트 앱을 이전하세요.

  • 기본적으로 사용 설정되는 R8: R8은 디슈가링, 축소, 난독화, 최적화, 덱싱 등을 모두 한 단계로 통합하여 빌드 성능을 눈에 띄게 개선합니다. R8은 Android Gradle 플러그인 3.3.0에서 도입되었으며 이제 플러그인 3.4.0 이상을 사용하는 앱 및 Android 라이브러리 프로젝트 모두에서 기본적으로 사용 설정됩니다.

    아래 이미지는 R8이 도입되기 전의 컴파일 프로세스를 개략적으로 보여줍니다.

    R8 이전에는 ProGuard가 덱싱 및 디슈가링과 다른 컴파일 단계였습니다.

    이제 R8을 사용하면 아래 그림과 같이 디슈가링, 축소, 난독화, 최적화, 덱싱(D8)이 모두 한 단계로 완료됩니다.

    R8에서는 디슈가링, 축소, 난독화, 최적화, 덱싱이 모두 하나의 컴파일 단계에서 실행됩니다.

    주의사항: R8은 기존 ProGuard 규칙과 호환하도록 설계되었으므로 별다른 조치를 취하지 않아도 R8을 활용할 수 있습니다. 그러나 R8은 Android 프로젝트용으로 특별히 설계된 ProGuard와는 다른 기술이기 때문에 ProGuard와는 달리 축소 및 최적화로 인해 코드가 삭제될 수 있습니다. 드문 경우이긴 하지만 코드가 삭제되면 코드를 빌드 출력에 유지하기 위해 규칙을 추가해야 할 수도 있습니다.

    R8을 사용하는 동안 문제가 발생하면 R8 호환성 FAQ를 읽고 문제해결 방법이 있는지 확인하세요. 해결 방법이 문서화되어 있지 않으면 버그를 신고하세요. 프로젝트의 gradle.properties 파일에 다음 행 중 하나를 추가하여 R8을 사용 중지할 수 있습니다.

    # Disables R8 for Android Library modules only.
    android.enableR8.libraries = false
    # Disables R8 for all modules.
    android.enableR8 = false
    
  • ndkCompile 지원이 중단됨: 이제 ndkBuild를 사용하여 기본 라이브러리를 컴파일하려고 하면 빌드 오류가 발생합니다. 프로젝트에 C 및 C++ 코드를 추가하려면 대신 CMake 또는 ndk-build를 사용해야 합니다.

알려진 문제

  • 고유한 패키지 이름의 올바른 사용법은 현재 적용되지 않지만 이후 버전의 플러그인에서 엄격하게 적용될 예정입니다. Android Gradle 플러그인 버전 3.4.0에서는 아래 행을 gradle.properties 파일에 추가하여 프로젝트가 허용되는 패키지 이름을 선언하는지 여부를 검사하도록 선택할 수 있습니다.

    android.uniquePackageNames = true
    

    Android Gradle 플러그인을 통한 패키지 이름 설정에 관해 자세히 알아보려면 애플리케이션 ID 설정을 참조하세요.

3.3.0(2019년 1월)

이 버전의 Android 플러그인에는 다음이 필요합니다.

3.3.3(2020년 7월)

이번 소규모 업데이트에서는 Android 11의 패키지 공개 상태와 관련된 새로운 기본 설정 및 기능과의 호환성을 지원합니다.

자세한 내용은 4.0.1 출시 노트를 참조하세요.

3.3.2(2019년 3월)

이번 소규모 업데이트는 Android 스튜디오 3.5.3을 지원하고 다양한 버그 수정 및 성능 개선을 포함합니다. 중요한 버그 수정 목록을 보려면 Release Updates 블로그에서 관련 게시물을 읽어보세요.

3.3.1(2019년 2월)

이번 소규모 업데이트는 Android 스튜디오 3.3.1을 지원하고 다양한 버그 수정 및 성능 개선을 포함합니다.

새로운 기능

  • 클래스 경로 동기화 개선: 런타임 및 컴파일 시간 클래스 경로에 관한 종속 항목을 확인할 때 Android Gradle 플러그인은 여러 클래스 경로에 나타나는 종속 항목에 관한 특정 다운스트림 버전 충돌을 수정하려고 합니다.

    예를 들어 런타임 클래스 경로에 라이브러리 A 버전 2.0이 포함되고 컴파일 클래스 경로에 라이브러리 A 버전 1.0이 포함된 경우 플러그인은 오류를 방지하기 위해 컴파일 클래스 경로에 관한 종속 항목을 라이브러리 A 버전 2.0으로 자동 업데이트합니다.

    그러나 런타임 클래스 경로에 라이브러리 A 버전 1.0이 포함되고 컴파일 클래스 경로에 라이브러리 A 버전 2.0이 포함된 경우 플러그인은 컴파일 클래스 경로에 관한 종속 항목을 라이브러리 A 버전 1.0으로 다운그레이드하지 않으므로 오류가 발생합니다. 자세한 내용은 클래스 경로 간 충돌 해결을 참조하세요.

  • 주석 프로세서 사용 시 증분 자바 컴파일 개선: 이 업데이트는 주석 프로세서 사용 시 증분 자바 컴파일에 관한 지원을 개선해 빌드 시간을 줄입니다.

    • Kotlin 전용 프로젝트 및 Kotlin-자바 하이브리드 프로젝트가 대부분인 Kapt를 사용하는 프로젝트의 경우: 데이터 결합이나 레트로 람다 플러그인을 사용하더라도 증분 자바 컴파일이 사용 설정됩니다. Kapt 작업에 의한 주석 처리는 아직 증분되지 않습니다.
    • Kapt를 사용하지 않는 자바 전용 프로젝트의 경우: 사용하는 주석 프로세서가 증분 주석 처리를 모두 지원하는 경우 증분 자바 컴파일이 기본으로 사용 설정됩니다. 증분 주석 프로세서 채택을 모니터링하려면 Gradle 문제 5277을 참조하세요.

      그러나 하나 이상의 주석 프로세서가 증분 빌드를 지원하지 않는다면 증분 자바 컴파일이 사용 설정되지 않습니다. 대신 gradle.properties 파일에 다음 플래그를 포함할 수 있습니다.

      android.enableSeparateAnnotationProcessing=true
      

      이 플래그를 포함하면 Android Gradle 플러그인이 별도의 작업에서 주석 프로세서를 실행하고 자바 컴파일 작업을 증분식으로 실행할 수 있습니다.

  • 더 이상 사용하지 않는 API를 사용할 때 더 나은 디버그 정보: 플러그인이 더 이상 지원되지 않는 API를 사용하고 있음을 감지하면 이제 API가 사용되는 위치를 판단하는 데 도움이 되는 자세한 정보를 제공할 수 있습니다. 추가 정보를 보려면 프로젝트의 gradle.properties 파일에 다음을 포함해야 합니다.

    android.debug.obsoleteApi=true
    

    명령줄에서 -Pandroid.debug.obsoleteApi=true를 전달하여 플래그를 사용 설정할 수 있습니다.

  • 명령줄에서 기능 모듈에 관한 계측 테스트를 실행할 수 있습니다.

동작 변경사항

  • 지연된 작업 구성: 플러그인은 이제 Gradle의 새로운 작업 생성 API를 사용하여 현재 빌드 또는 실행 작업 그래프에 없는 작업을 완료하는 데 필요하지 않은 작업의 초기화 및 구성을 방지합니다. 예를 들어 'release' 및 'debug' 빌드 변형과 같은 여러 빌드 변형이 있고 앱의 'debug' 버전을 빌드하고 있다면 플러그인은 앱의 'release' 버전의 작업을 초기화하거나 구성하지 않습니다.

    variant.getJavaCompile()과 같은 Variants API에서 특정 이전 메서드를 호출하면 여전히 작업 구성을 강제할 수도 있습니다. 지연 작업 구성에 빌드가 최적화되어 있는지 확인하려면 variant.getJavaCompileProvider()와 같은 TaskProvider 객체를 대신 반환하는 새로운 메서드를 호출합니다.

    사용자설정 빌드 작업을 실행하는 경우 Gradle의 새로운 작업 생성 API에 적응하는 방법을 배우세요.

  • useProguard false를 설정할 때 지정된 빌드 유형의 경우 플러그인은 이제 ProGuard 대신 R8을 사용하여 앱의 코드와 리소스를 축소 및 난독화합니다. R8에 관한 자세한 내용은 Android 개발자 블로그에서 이 블로그 게시물을 읽어 보세요.

  • 라이브러리 프로젝트를 위한 더 빠른 R 클래스 생성: 이전에는 Android Gradle 플러그인이 각 프로젝트의 종속 항목에 관해 R.java 파일을 생성한 다음 R 클래스를 앱의 다른 클래스와 함께 컴파일했습니다. 이제 플러그인은 먼저 중간 R.java 클래스를 빌드하지 않고 앱의 컴파일된 R 클래스를 포함하는 JAR을 직접 생성합니다. 이러한 최적화로 라이브러리 하위 프로젝트 및 종속 항목을 많이 포함하는 프로젝트의 빌드 성능이 크게 개선되고 Android 스튜디오의 색인 생성 속도도 개선될 수 있습니다.

  • 이제 Android App Bundle을 빌드할 때 Android 6.0(API 수준 23) 이상을 타겟팅하는 App Bundle에서 생성된 APK에 압축되지 않은 버전의 네이티브 라이브러리가 기본적으로 포함됩니다. 이러한 최적화로 기기가 라이브러리를 복사하지 않아도 되므로 앱의 디스크 크기가 줄어듭니다. 최적화를 사용 중지하려면 gradle.properties 파일에 다음을 추가합니다.

    android.bundle.enableUncompressedNativeLibs = false
    
  • 플러그인은 일부 타사 플러그인의 최소 버전을 시행합니다.

  • 단일 변형 프로젝트 동기화: 빌드 구성과 프로젝트를 동기화하는 것은 Android 스튜디오가 프로젝트의 구성 방식을 이해하도록 하는 데 중요한 단계입니다. 하지만 프로젝트 규모가 큰 경우 이 과정에 시간이 오래 걸릴 수 있습니다. 프로젝트에서 빌드 변형을 여러 개 사용하는 경우 이제 프로젝트 동기화를 현재 선택한 변형으로만 제한하여 최적화할 수 있습니다.

    이 최적화를 사용 설정하려면 Android 스튜디오 3.3 이상과 Android Gradle 플러그인 3.3.0 이상을 사용해야 합니다. 이러한 요구사항을 충족하면 프로젝트를 동기화할 때 IDE에서 이 최적화를 사용 설정하라는 메시지가 표시됩니다. 최적화는 새로운 프로젝트에도 기본으로 사용 설정됩니다.

    최적화를 수동으로 사용 설정하려면 File > Settings > Experimental > Gradle(Mac은 Android Studio > Preferences > Experimental > Gradle)을 클릭하고 Only sync the active variant 체크박스를 선택합니다.

    참고: 이 최적화는 자바 및 C++ 언어를 포함하는 프로젝트를 완전히 지원하며 Kotlin을 일부 지원합니다. Kotlin 콘텐츠가 포함된 프로젝트의 최적화를 사용 설정하면 Gradle 동기화는 전체 변형을 내부적으로 사용하는 방식으로 되돌아갑니다.

  • 누락된 SDK 패키지 자동 다운로드: 이 기능은 NDK를 지원하고자 확장되었습니다. 자세한 내용은 Gradle을 사용하여 누락된 패키지 자동 다운로드를 읽어보세요.

버그 수정

  • Android Gradle 플러그인 3.3.0은 다음 문제를 해결합니다.

    • Jetfier가 사용 설정되었지만 AndroidX 버전 대신 android.support.v8.renderscript.RenderScript를 호출하는 빌드 프로세스
    • 정적으로 번들된 annotation.AnyRes를 포함하는 androidx-rs.jar로 인한 충돌
    • RenderScript를 사용하는 경우 build.gradle 파일에 빌드 도구 버전을 더 이상 수동으로 설정하지 않아도 됨

3.2.0(2018년 9월)

이 버전의 Android 플러그인에는 다음이 필요합니다.

3.2.1(2018년 10월)

이 업데이트를 통해 더 이상 SDK 빌드 도구의 버전을 지정하지 않아도 됩니다. 이제 Android Gradle 플러그인이 기본적으로 버전 28.0.3을 사용합니다.

새로운 기능

  • Android App Bundle 빌드 지원: 이 App Bundle은 모든 앱의 컴파일된 코드와 리소스를 포함하는 동시에 APK 생성 및 Google Play 스토어 서명은 지연시키는 새로운 업로드 포맷입니다. 더 이상 여러 APK를 빌드, 서명, 관리할 필요가 없으며 사용자는 기기에 최적화된 작은 용량을 다운로드합니다. 자세한 내용은 Android App Bundle 정보를 읽어보세요.

  • 주석 프로세서 사용 시 개선된 증분 빌드 속도 지원: 이제 AnnotationProcessorOptions DSL이 CommandLineArgumentProvider를 확장하여 개발자나 주석 프로세서 작성자가 증분 빌드 속성 유형 주석을 사용하는 프로세서의 인수에 주석을 달 수 있습니다. 이러한 주석을 사용하면 증분 및 캐시된 클린 빌드의 정확성과 성능이 개선됩니다. 자세한 내용은 주석 프로세서에 인수 전달을 읽어보세요.

  • AndroidX용 이전 도구: Android 3.2 이상에서 Android Gradle 플러그인 3.2.0을 사용하는 경우 메뉴 바에서 Refactor > Migrate to AndroidX를 선택하여 프로젝트의 로컬 및 Maven 종속 항목을 이전해 새로운 AndroidX 라이브러리를 사용할 수 있습니다. 이 이전 도구를 사용하면 gradle.properties 파일에서 다음 플래그를 true로 설정하기도 합니다.

    • android.useAndroidX: true로 설정하면 Android 플러그인은 지원 라이브러리 대신 적절한 AndroidX 라이브러리를 사용합니다. 이 플래그를 지정하지 않으면 Android 플러그인은 기본적으로 false로 설정합니다.
    • android.enableJetifier: true로 설정하면 Android 플러그인은 바이너리를 다시 작성해 기존 타사 라이브러리를 자동으로 이전하여 AndroidX를 사용합니다. 이 플래그를 지정하지 않으면 Android 플러그인은 기본적으로 false로 설정합니다. android.useAndroidXtrue로 설정한 경우에만 이 플래그를 true로 설정할 수 있고 그러지 않으면 빌드 오류가 발생합니다.

    자세한 내용은 AndroidX 개요를 읽어보세요.

  • 새로운 코드 축소기 R8: R8은 ProGuard를 대체하는 코드 축소 및 난독화를 위한 새로운 도구입니다. 프로젝트의 gradle.properties 파일에 다음 코드를 포함하여 R8의 미리보기 버전을 사용할 수 있습니다.

    android.enableR8 = true
    

동작 변경사항

  • D8을 사용한 디슈가링이 기본적으로 사용 설정됩니다.
  • 이제 AAPT2가 Google의 Maven 저장소에 있습니다. AAPT2를 사용하려면 아래와 같이 build.gradle 파일에 google() 종속 항목이 있는지 확인하세요.

    buildscript {
          repositories {
              google() // here
              jcenter()
          }
          dependencies {
              classpath 'com.android.tools.build:gradle:3.2.0'
          }
      }
      allprojects {
          repositories {
              google() // and here
              jcenter()
      }
    
  • 이제 네이티브 multidex가 기본적으로 사용 설정됩니다. 이전 버전의 Android 스튜디오에서는 Android API 수준 21 이상을 실행하는 기기에 앱의 디버그 버전을 배포할 때 네이티브 multidex를 사용 설정했습니다. 이제 기기에 배포하든 출시용 APK를 빌드하든 Android Gradle 플러그인이 minSdkVersion=21 이상을 설정한 모든 모듈에 네이티브 multidex를 사용 설정합니다.

  • 이제 플러그인이 최소 버전의 protobuf 플러그인(0.8.6), Kotlin 플러그인(1.2.50), Crashlytics 플러그인(1.25.4)을 시행합니다.

  • 이제 기능 모듈 플러그인 com.android.feature가 모듈 이름을 지정할 때 문자, 숫자, 밑줄만을 사용하게 합니다. 예를 들어 기능 모듈 이름에 대시가 포함된 경우 빌드 오류가 발생합니다. 이 동작은 동적 기능 플러그인의 동작과 일치합니다.

버그 수정

  • 이제 JavaCompile이 데이터 결합이 있는 프로젝트에서 캐시 가능합니다. (문제 #69243050)
  • 데이터 결합이 있는 라이브러리 모듈에 관한 컴파일 방지가 개선됩니다. (문제 #77539932)
  • 일부 예기치 않은 빌드 오류로 인해 이전 버전에서 configure-on-demand를 사용 중지한 경우 이제 이를 다시 사용 설정할 수 있습니다. (문제 #77910727)

3.1.0(2018년 3월)

이 버전의 Android 플러그인에는 다음이 필요합니다.

  • Gradle 4.4 이상. 자세한 내용은 Gradle 업데이트하기 섹션을 읽어보세요.
  • 빌드 도구 27.0.3 이상. 주의사항: android.buildToolsVersion 속성을 사용하여 빌드 도구의 버전을 더 이상 지정하지 않아도 됩니다. 플러그인은 필요한 최소 버전을 기본적으로 사용합니다.

새로운 DEX 컴파일러, D8

이제 Android 스튜디오는 D8이라 부르는 새로운 DEX 컴파일러를 기본적으로 사용합니다. DEX 컴파일은 Android 런타임 또는 이전 버전 Android의 Dalvik에서 .class 바이트 코드를 .dex 바이트 코드로 변환하는 프로세스입니다. 이전 컴파일러 DX와 비교할 때 D8은 더 빠르게 컴파일하고 더 작은 DEX 파일을 출력하면서 앱 런타임 성능은 동일하거나 더 좋게 유지합니다.

D8은 일상적인 앱 개발 워크플로를 변경하지 않습니다. 그러나 새로운 컴파일러와 관련된 문제가 발생하면 버그를 신고하세요. 프로젝트의 gradle.properties 파일에 다음을 포함하여 D8을 일시적으로 사용 중지하고 DX를 사용할 수 있습니다.

android.enableD8=false

자바 8 언어 기능을 사용하는 프로젝트의 경우 증분 디슈가링이 기본적으로 사용 설정됩니다. 프로젝트의 gradle.properties 파일에 다음을 지정하여 사용 중지할 수 있습니다.

android.enableIncrementalDesugaring=false.

미리보기 사용자: 이미 D8의 미리보기 버전을 사용하고 있다면 이제 JDK가 아니라 SDK 빌드 도구에 포함된 라이브러리에서 컴파일합니다. 따라서 JDK에는 있지만 SDK 빌드 도구 라이브러리에는 없는 API에 액세스하는 경우 컴파일 오류가 발생합니다.

동작 변경사항

  • 각각 다른 ABI를 타겟팅하는 여러 APK를 빌드할 때 플러그인이 더 이상 mips, mips64, armeabi 등 ABI용 APK를 기본적으로 생성하지 않습니다.

    이러한 ABI를 타겟팅하는 APK를 빌드하려면 NDK r16b 이하를 사용하고 아래와 같이 build.gradle 파일에 ABI를 지정해야 합니다.

    splits {
      abi {
          include 'armeabi', 'mips', 'mips64'
          ...
      }
    }
    
  • Android 인스턴트 앱의 구성 APK를 빌드하는 경우 이제 언어 구성 분할이 기본적으로 루트 언어별로 그룹화됩니다. 예를 들어 앱에 zh-TW 또는 zh-CN 언어 리소스가 포함된 경우 Gradle이 그와 같은 리소스를 zh 언어 구성 분할로 패키징합니다. 아래와 같이 include 속성을 사용하여 자체 그룹을 정의함으로써 이 동작을 재정의할 수 있습니다.

    splits {
        language {
            enable true
            // Each string defines a group of locales that
            // Gradle should package together.
            include "in,id",
                    "iw,he",
                    "fil,tl,tgl",
                    "yue,zh,zh-TW,zh-CN"
        }
    }
    
  • 이제 Android 플러그인의 빌드 캐시가 30일 이상 된 캐시 항목을 제거합니다.

  • "auto"resConfig로 전달하면 더 이상 자동으로 문자열 리소스를 선택하여 APK로 패키징하지 않습니다. 계속해서 "auto"를 사용하면 플러그인이 앱과 앱의 종속 항목이 제공하는 모든 문자열 리소스를 패키징합니다. 따라서 개발자는 플러그인을 통해 APK로 패키징하고자 하는 각 언어를 대신 지정해야 합니다.

  • 로컬 모듈은 앱의 테스트 APK에 의존할 수 없기 때문에 androidTestImplementation 대신 androidTestApi 구성을 사용하여 계측 테스트에 종속 항목을 추가하면 Gradle에서 다음과 같은 경고가 발생합니다.

      WARNING: Configuration 'androidTestApi' is obsolete
      and has been replaced with 'androidTestImplementation'
    

수정

  • Android 스튜디오가 복합 빌드의 종속 항목을 적절히 인식하지 못하는 경우의 문제 해결
  • 단일 빌드에서 Android 플러그인을 여러 번 로드할 때 프로젝트 동기화 오류가 발생하는 경우의 문제 해결. 예: 여러 하위 프로젝트가 빌드스크립트 클래스 경로에 Android 플러그인을 각각 포함하는 경우

3.0.0(2017년 10월)

Android Gradle 플러그인 3.0.0에는 대규모 프로젝트의 성능 문제를 해결하려는 다양한 변경사항이 포함됩니다.

예를 들어 ~130개의 모듈과 수많은 외부 종속 항목이 있고 코드나 리소스는 없는 샘플 골격 프로젝트에서 다음과 유사한 성능 개선을 경험할 수 있습니다.

Android 플러그인 버전 + Gradle 버전 Android 플러그인 2.2.0 + Gradle 2.14.1 Android 플러그인 2.3.0 + Gradle 3.3 Android 플러그인 3.0.0 + Gradle 4.1
구성(예: ./gradlew --help 실행하기) ~2분 ~9초 ~2.5초
한 줄 자바 변경(구현 변경) ~2분 15초 ~29초 ~6.4초

이러한 변경사항의 일부는 기존 빌드를 손상합니다. 따라서 새로운 플러그인을 사용하기 전에 프로젝트의 이전을 고려해야 합니다.

위에 설명한 성능 개선이 발생하지 않으면 버그를 신고하고 Gradle Profiler를 사용하여 빌드의 트레이스를 포함하세요.

이 버전의 Android 플러그인에는 다음이 필요합니다.

  • Gradle 4.1 이상. 자세한 내용은 Gradle 업데이트하기 섹션을 읽어보세요.
  • 빌드 도구 26.0.2 이상. 이 업데이트를 통해 빌드 도구의 버전을 더 이상 지정하지 않아도 됩니다. 플러그인은 필요한 최소 버전을 기본적으로 사용합니다. 따라서 이제 android.buildToolsVersion 속성을 삭제할 수 있습니다.

3.0.1(2017년 11월)

이번 소규모 업데이트는 Android 스튜디오 3.0.1을 지원하고 일반적인 버그 수정 및 성능 개선을 포함합니다.

최적화

  • 세밀한 작업 그래프를 통해 다중 모듈 프로젝트의 동시 로드를 개선합니다.
  • 종속 항목을 변경할 때 Gradle은 종속 항목의 API에 액세스 권한이 없는 모듈을 다시 컴파일하지 않음으로써 더 빠르게 빌드합니다. Gradle의 새로운 종속 항목 구성을 사용(implementation, api, compileOnly, runtimeOnly)하여 다른 모듈에 API를 유출하는 종속 항목을 제한해야 합니다.
  • 클래스별 덱싱으로 인해 증분 빌드 속도가 더 빨라집니다. 이제 각 클래스가 별도의 DEX 파일로 컴파일되며 수정된 클래스만 re-dex됩니다. minSdkVersion를 20 이하로 설정하고 레거시 multi-dex를 사용하는 앱의 빌드 속도도 개선됩니다.
  • 특정 작업을 최적화함으로써 빌드 속도를 개선하여 캐시된 출력을 사용합니다. 이 최적화의 이점을 얻으려면 먼저 Gradle 빌드 캐시를 사용 설정해야 합니다.
  • AAPT2를 사용하여 증분 리소스 처리를 개선하며 이제 이것은 기본적으로 사용 설정됩니다. AAPT2를 사용하는 동안 문제가 발생하면 버그를 신고하세요. gradle.properties 파일에 android.enableAapt2=false를 설정하고 명령줄에서 ./gradlew --stop를 실행하여 Gradle 데몬을 다시 시작함으로써 AAPT2를 사용 중지할 수도 있습니다.

새로운 기능

  • 변형 인식 종속 항목 관리. 모듈의 특정 변형을 빌드할 때 이제 플러그인이 로컬 라이브러리 모듈 종속 항목의 변형을 빌드 중인 모듈의 변형과 자동으로 일치시킵니다.
  • 새로운 기능 모듈 플러그인을 포함하여 Android 인스턴트 앱SDK Manager를 사용해 다운로드할 수 있는 Android 인스턴트 앱 SDK를 지원합니다. 새로운 플러그인으로 기능 모듈을 생성하는 방법에 관한 자세한 내용은 여러 기능이 있는 인스턴트 앱의 구조를 읽어보세요.
  • 특정 자바 8 언어 기능 및 자바 8 라이브러리 사용을 위한 지원이 내장됩니다. 이제 Jack은 지원 중단되고 더 이상 필요하지 않으므로 먼저 Jack을 사용 중지하여 기본 도구 모음에 빌드된 개선된 자바 8 지원을 사용해야 합니다. 자세한 내용은 자바 8 언어 기능 사용을 읽어보세요.
  • Android Test Orchestrator로 실행하는 테스트를 추가로 지원하여 앱의 자체 Instrumentation 호출 내에서 각 앱의 테스트를 실행할 수 있습니다. 각 테스트는 자체 Instrumentation 인스턴스에서 실행되므로 테스트 간의 공유 상태가 기기의 CPU나 메모리에 누적되지 않습니다. 테스트 하나가 비정상 종료되더라도 자체 Instrumentation 인스턴스만 중단하므로 다른 테스트는 계속 실행됩니다.
    • testOptions.execution를 추가하여 기기 내 테스트 조정의 사용 여부를 판단합니다. Android Test Orchestrator를 사용하려면 아래와 같이 ANDROID_TEST_ORCHESTRATOR를 지정해야 합니다. 이 속성은 기본적으로 HOST로 설정되며 기기 내 조정을 사용 중지하고 테스트를 실행하는 표준 메서드입니다.
android {
  testOptions {
    execution 'ANDROID_TEST_ORCHESTRATOR'
  }
}
  • 새로운 androidTestUtil 종속 항목 구성으로 Android Test Orchestrator와 같은 계측 테스트를 실행하기 전에 다른 테스트 도우미 APK를 설치할 수 있습니다.
dependencies {
  androidTestUtil 'com.android.support.test:orchestrator:1.0.0'
  ...
}
  • testOptions.unitTests.includeAndroidResources를 추가하여 Android 리소스가 필요한 단위 테스트를 지원합니다(예: Roboelectric). 이 속성을 true로 설정하면 플러그인은 단위 테스트를 실행하기 전에 리소스와 애셋, 매니페스트 병합을 이행합니다. 그런 다음 테스트에서 다음 키가 있는지 클래스 경로의 com/android/tools/test_config.properties를 검사할 수 있습니다.
    • android_merged_assets: 병합된 assets 디렉터리의 절대 경로입니다.

      참고: 라이브러리 모듈의 경우 병합된 애셋에는 종속 항목 애셋이 포함되지 않습니다(문제 #65550419를 참조하세요).

    • android_merged_manifest: 병합된 매니페스트 파일의 절대 경로입니다.
    • android_merged_resources: 모듈의 모든 리소스 및 모든 종속 항목을 포함하는 병합된 리소스 디렉터리의 절대 경로입니다.
    • android_custom_package: 최종 R 클래스의 패키지 이름입니다. 동적으로 애플리케이션 ID를 수정하면 이 패키지 이름이 앱의 매니페스트에 있는 package 속성과 일치하지 않을 수 있습니다.
  • 리소스로 글꼴 지원입니다(이것은 Android 8.0(API 수준 26)에 도입된 새로운 기능입니다).
  • Android 인스턴트 앱 SDK 1.1 이상에서 언어별 APK를 지원합니다. 자세한 내용은 순수 분할을 위한 빌드 구성을 참조하세요.
  • 이제 아래와 같이 외부 네이티브 빌드 프로젝트의 출력 디렉터리를 변경할 수 있습니다.
android {
    ...
    externalNativeBuild {
        // For ndk-build, instead use the ndkBuild block.
        cmake {
            ...
            // Specifies a relative path for outputs from external native
            // builds. You can specify any path that's not a subdirectory
            // of your project's temporary build/ directory.
            buildStagingDirectory "./outputs/cmake"
        }
    }
}
  • 이제 Android 스튜디오에서 네이티브 프로젝트를 빌드할 때 CMake 3.7 이상을 사용할 수 있습니다.
  • 새로운 lintChecks 종속 항목 구성으로 사용자설정 린트 규칙을 정의하는 JAR을 빌드하고 AAR 및 APK 프로젝트로 패키징할 수 있습니다. 사용자설정 린트 규칙은 단일 JAR을 출력하고 compileOnly 종속 항목만 포함하는 별도의 프로젝트에 속해야 합니다. 그러면 다른 앱 및 라이브러리 모듈이 lintChecks 구성을 사용하여 린트 프로젝트에 종속될 수 있습니다.
dependencies {
    // This tells the Gradle plugin to build ':lint-checks' into a lint.jar file
    // and package it with your module. If the module is an Android library,
    // other projects that depend on it automatically use the lint checks.
    // If the module is an app, lint includes these rules when analyzing the app.
    lintChecks project(':lint-checks')
}

동작 변경사항

  • Android 플러그인 3.0.0은 특정 API를 삭제하여 이를 사용하면 빌드가 손상됩니다. 예를 들어 더 이상 변형 API를 사용하여 outputFile() 객체에 액세스하거나 processManifest.manifestOutputFile()을 사용하여 각 변형의 매니페스트 파일을 얻을 수 없습니다. 자세한 내용은 API 변경사항을 읽어보세요.
  • 더 이상 빌드 도구의 버전을 지정할 필요가 없으므로 이제 android.buildToolsVersion 속성을 삭제할 수 있습니다. 기본적으로 플러그인은 사용하고 있는 Android 플러그인 버전에 필요한 빌드 도구의 최소 버전을 자동으로 사용합니다.
  • 이제 아래와 같이 buildTypes 블록에서 PNG 크런칭을 사용 설정/중지합니다. PNG 크런칭은 디버그 빌드를 제외한 모든 빌드에 기본적으로 사용 설정되는데 그 이유는 많은 PNG 파일을 포함한 프로젝트의 빌드 시간이 증가하기 때문입니다. 따라서 다른 빌드 유형의 빌드 시간을 개선하려면 PNG 크런칭을 사용 중지하거나 이미지를 WebP로 변환해야 합니다.
android {
  buildTypes {
    release {
      // Disables PNG crunching for the release build type.
      crunchPngs false
    }
  }
}
  • 이제 Android 플러그인이 외부 CMake 프로젝트에서 구성한 실행 가능한 타겟을 자동으로 빌드합니다.
  • 이제 annotationProcessor 종속 항목 구성을 사용하여 프로세서 클래스 경로에 주석 프로세서를 추가해야 합니다.
  • 지원 중단된 ndkCompile 사용이 더 제한됩니다. 대신 CMake나 ndk-build를 사용하여 APK로 패키징하려는 네이티브 코드를 컴파일하여 이전해야 합니다. 자세한 내용은 ndkcompile에서 이전을 읽어보세요.

2.3.0(2017년 2월)

2.3.3(2017년 6월)

이번 소규모 업데이트에는 Android 스튜디오 2.3.3과의 호환성이 추가됩니다.

2.3.2(2017년 5월)

이번 소규모 업데이트에는 Android 스튜디오 2.3.2와의 호환성이 추가됩니다.

2.3.1(2017년 4월)

이번 Android 플러그인 2.3.0의 업데이트는 일부 실제 Android 기기가 Instant Run과 제대로 호환되지 않을 경우의 문제를 해결합니다(문제 #235879를 참조하세요).

종속 항목:
신규:
  • 성능 개선 및 새로운 기능이 포함된 Gradle 3.3을 사용합니다. 자세한 내용은 Gradle 출시 노트를 참조하세요.
  • 빌드 캐시: 프로젝트를 빌드할 때 Android 플러그인이 생성하는 특정 출력을 저장합니다(예: 패키징되지 않은 AAR, pre-dexed 원격 종속 항목). 클린 빌드는 캐시를 사용하는 동안 훨씬 더 빠릅니다. 그 이유는 빌드 시스템이 후속 빌드 중에 캐시된 파일을 다시 생성하는 것이 아니라 재사용하면 되기 때문입니다. Android 플러그인 2.3.0 이상을 사용하는 프로젝트는 기본적으로 빌드 캐시를 사용합니다. 자세한 내용은 빌드 캐시로 빌드 속도 개선을 읽어보세요.
변경사항:

2.2.0(2016년 9월)

종속 항목:
신규:
  • 성능 개선 및 새로운 기능을 포함하는 Gradle 2.14.1을 사용하고 Gradle 데몬을 사용할 때 로컬 권한 에스컬레이션을 허용하는 보안 취약점을 해결합니다. 자세한 내용은 Gradle 출시 노트를 참조하세요.
  • externalNativeBuild {} DSL을 사용하여 이제 Gradle로 네이티브 소스에 연결하고 CMake나 ndk-build를 사용하여 네이티브 라이브러리를 컴파일할 수 있습니다. 네이티브 라이브러리를 빌드한 후에 APK로 패키징합니다. Gradle로 CMake 및 ndk-build를 사용하는 방법에 관한 자세한 내용은 프로젝트에 C 및 C++ 코드 추가를 읽어보세요.
  • 명령줄에서 빌드를 실행하면 이제 Gradle이 누락된 SDK 구성요소나 프로젝트가 종속하는 업데이트를 자동 다운로드하려고 시도합니다. 자세한 내용은 Gradle로 누락된 패키지 자동 다운로드를 읽어보세요.
  • 새로운 실험용 캐싱 기능으로 Gradle이 pre-dexed 버전 라이브러리를 pre-dexing, 저장, 재사용하여 빌드 시간을 단축할 수 있습니다. 이 실험용 기능 사용에 관한 자세한 내용은 빌드 캐시 가이드를 읽어보세요.
  • 작업 한 번으로 압축과 서명, zipaligning을 처리하는 새로운 기본 패키징 파이프라인을 채택해 빌드 성능을 개선합니다. gradle.properties 파일에 android.useOldPackaging=true을 추가하여 이전 패키징 도구를 사용하도록 되돌릴 수 있습니다. 새로운 패키징 도구를 사용하는 동안 zipalignDebug 작업은 사용할 수 없습니다. 그러나 createZipAlignTask(String taskName, File inputFile, File outputFile) 메서드를 호출하여 직접 그 작업을 생성할 수 있습니다.
  • 이제 APK 서명이 기본 JAR 서명 외에도 APK Signature Scheme v2를 사용합니다. 모든 Android 플랫폼이 그 결과로 발생하는 APK를 허용합니다. 서명 후 이러한 APK를 수정하면 v2 서명이 무효화되고 기기에 설치되지도 않습니다. 이 기능을 사용 중지하려면 모듈 레벨 build.gradle 파일에 다음을 추가하세요.
    android {
      ...
      signingConfigs {
        config {
          ...
          v2SigningEnabled false
        }
      }
    }
    
  • multidex 빌드의 경우 이제 ProGuard 규칙을 사용하여 Gradle이 앱의 기본 DEX 파일로 컴파일해야 할 클래스를 결정할 수 있습니다. 앱을 시작할 때 Android 시스템이 기본 DEX 파일을 먼저 로드하기 때문에 시작 시 특정 클래스를 기본 DEX 파일로 컴파일하여 우선순위를 정할 수 있습니다. 기본 DEX 파일용으로 특별히 ProGuard 구성 파일을 생성한 후 buildTypes.multiDexKeepProguard을 사용하여 구성 파일의 경로를 Gradle로 전달합니다. 이 DSL을 사용하는 것은 buildTypes.proguardFiles을 사용하는 것과 다르며 앱의 일반적인 ProGuard 규칙을 제공하지만 기본 DEX 파일의 클래스를 지정하지는 않습니다.
  • android:extractNativeLibs 플래그 지원을 추가하여 기기에 앱을 설치할 때 앱의 크기를 줄일 수 있습니다. 앱 매니페스트의 <application> 요소에서 이 플래그를 false로 설정하면 Gradle이 APK로 압축되지 않고 정렬된 버전의 네이티브 라이브러리를 패키징합니다. 이로써 설치하는 동안 PackageManager가 네이티브 라이브러리를 APK에서 기기의 파일 시스템으로 복사할 수 없고 앱의 델타 업데이트 용량이 적어지는 추가 혜택이 있습니다.
  • 이제 제품 버전에 versionNameSuffixapplicationIdSuffix를 지정할 수 있습니다. (문제 59614)
변경사항:
  • 이제 getDefaultProguardFile이 Gradle용 Android 플러그인이 제공하는 기본 ProGuard 파일을 반환하고 더 이상 Android SDK의 파일을 사용하지 않습니다.
  • Jack 컴파일러 성능 및 기능을 개선합니다.
    • testCoverageEnabledtrue로 설정할 때 이제 Jack이 Jacoco 테스트 대상 범위를 지원합니다.
    • 주석 프로세서 지원을 개선합니다. 클래스 경로의 주석 프로세서(예: compile 종속 항목)가 빌드에 자동으로 적용됩니다. 모듈 레벨 build.gradle 파일에서 javaCompileOptions.annotationProcessorOptions {} DSL을 사용하여 빌드에 주석 프로세서를 지정하고 인수를 전달할 수도 있습니다.
      android {
        ...
        defaultConfig {
          ...
          javaCompileOptions {
            annotationProcessorOptions {
              className 'com.example.MyProcessor'
              // Arguments are optional.
              arguments = [ foo : 'bar' ]
            }
          }
        }
      }
      

      컴파일 시간 주석 프로세서를 적용하고 APK에는 이를 포함하지 않으려면 annotationProcessor 종속 항목 범위를 사용하세요.

      dependencies {
          compile 'com.google.dagger:dagger:2.0'
          annotationProcessor 'com.google.dagger:dagger-compiler:2.0'
         // or use buildVariantAnnotationProcessor to target a specific build variant
      }
      
    • jackOptions.additionalParameters()를 사용하여 Jack에 추가 플래그를 설정할 수 있습니다. 다음 코드 스니펫은 jack.incremental 매개변수를 true로 설정합니다.
      android {
        defaultConfig {
          ...
          jackOptions {
            enabled true
            additionalParameters("jack.incremental" : true)
          }
        }
      }
      

      설정할 수 있는 매개변수 목록을 보려면 명령줄에서 다음을 실행하세요.

      java -jar /build-tools/jack.jar --help-properties
      
    • 기본적으로 Gradle 데몬의 힙 크기가 1.5GB 이상이면 이제 Jack이 Gradle과 같은 프로세스에서 실행됩니다. 데몬 힙 크기를 조정하려면 다음을 gradle.properties 파일에 추가하세요.
      # This sets the daemon heap size to 1.5GB.
      org.gradle.jvmargs=-Xmx1536M
      

2.1.0(2016년 4월)

2.1.3(2016년 8월)

이 업데이트에는 Gradle 2.14.1 이상이 필요합니다. Gradle 2.14.1에는 성능 개선, 새로운 기능, 중요한 보안 수정사항이 포함됩니다. 자세한 내용은 Gradle 출시 노트를 참조하세요.

종속 항목:
신규:
  • Jack 도구 모음을 사용하여 N 개발자 미리보기인 JDK8과 자바 8 언어 기능의 지원을 추가합니다. 자세한 내용은 N 미리보기 가이드를 읽어보세요.

    참고: Instant Run은 현재 Jack과 호환되지 않으며 새로운 도구 모음을 사용하는 동안 사용 중지됩니다. N 미리보기용으로 개발 중이고 지원되는 자바 8 언어 기능을 사용하려는 경우에만 Jack을 사용해야 합니다.

  • 증분 자바 컴파일에 관한 기본 지원을 추가하여 개발하는 동안 컴파일 시간을 단축합니다. 변경되었거나 다시 컴파일해야 하는 소스 부분만 다시 컴파일하여 시간을 단축합니다. 이 기능을 사용 중지하려면 모듈 레벨 build.gradle 파일에 다음을 추가하세요.
    android {
      ...
      compileOptions {
        incremental false
      }
    }
    
  • 별도의 외부 VM 프로세스가 아닌 빌드 프로세스 내에서 덱싱을 이행하는 dexing-in-process의 지원을 추가합니다. 이로 인해 증분 빌드가 빨라질 뿐만 아니라 전체 빌드 속도도 개선됩니다. 이 기능은 Gradle 데몬의 최대 힙 크기를 2048MB 이상으로 설정한 프로젝트에 기본적으로 사용 설정됩니다. 프로젝트의 gradle.properties 파일에 다음을 포함하여 이를 이행할 수 있습니다.

    org.gradle.jvmargs = -Xmx2048m
    

    모듈 레벨 build.gradle 파일에서 javaMaxHeapSize 값을 정의한 경우 org.gradle.jvmargsjavaMaxHeapSize + 1024MB 값으로 설정해야 합니다. 예를 들어 javaMaxHeapSize를 '2048m'으로 설정한 경우 프로젝트의 gradle.properties 파일에 다음을 추가해야 합니다.

    org.gradle.jvmargs = -Xmx3072m
    

    dexing-in-process를 사용 중지하려면 모듈 레벨 build.gradle 파일에 다음 코드를 추가하세요.

    android {
      ...
      dexOptions {
          dexInProcess false
      }
    }
    

2.0.0 (2016년 4월)

종속 항목:
신규:
  • 바이트 코드 삽입을 지원하고 에뮬레이터나 실제 기기에서 실행 중인 앱에 코드 및 리소스 업데이트를 푸시하여 Instant Run을 사용 설정합니다.
  • 앱이 실행되지 않는 경우에도 증분 빌드 지원을 추가합니다. Android 디버그 브리지를 통해 증분 변경사항을 연결된 기기에 푸시하여 전체 빌드 시간이 개선됩니다.
  • maxProcessCount를 추가하여 동시에 생성할 수 있는 최대 slave dex 프로세스 수를 제어합니다. 모듈 레벨 build.gradle 파일의 다음 코드는 최대 동시 프로세스 수를 4로 설정합니다.
    android {
      ...
      dexOptions {
        maxProcessCount = 4 // this is the default value
      }
    }
    
  • 실험용 코드 축소기를 추가하여 종속 항목의 pre-dexing을 지원하고 re-dexing을 줄이며 이것은 Proguard에서 지원되지 않습니다. 이로써 디버그 빌드 변형의 빌드 속도가 개선됩니다. 실험용 축소기가 최적화 및 난독화를 지원하지 않으므로 출시 빌드에 Proguard를 사용 설정해야 합니다. 디버그 빌드에 실험용 축소기를 사용 설정하려면 모듈 레벨 build.gradle 파일에 다음을 추가하세요.
    android {
      ...
      buildTypes {
        debug {
          minifyEnabled true
          useProguard false
        }
        release {
          minifyEnabled true
          useProguard true // this is a default setting
        }
      }
    }
    
  • 리소스 축소기의 로깅 지원 및 성능 개선을 추가합니다. 이제 리소스 축소기가 모든 작업을 Proguard 로그 파일과 동일한 폴더에 있는 resources.txt 파일에 기록합니다.
변경된 동작:
  • minSdkVersion이 18 이상으로 설정된 경우 APK 서명은 SHA256을 사용합니다.
  • 이제 DSA 및 ECDSA 키가 APK 패키지에 서명할 수 있습니다.

    참고: Android 키 저장소 제공자는 더 이상 API 수준 23 이상인 Android 6.0의 DSA 키를 지원하지 않습니다.

해결된 문제:
  • 테스트 및 기본 빌드 구성 모두에서 AAR 종속 항목이 중복되는 문제가 해결되었습니다.

이전 출시