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 파일에서 플러그인을 버전 3.6.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:3.6.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.24.10.1+
3.4.0~3.4.15.1.1+
3.5.0-3.5.35.4.1+
3.6.0+5.6.4+

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

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

3.6.0(2020년 2월)

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

새로운 기능

이 버전의 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 단위 테스트를 포함한 모든 단위 테스트는 이제 완전히 캐시 가능합니다. 자세한 내용은 문제 #115873047을 참조하세요.

버그 수정

이 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.3(2019년 12월)

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

3.5.2(2019년 11월)

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

3.5.1(2019년 10월)

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

증분 주석 처리

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

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

캐시 가능한 단위 테스트

Android 리소스, 애셋, manifest를 사용하기 위해 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.2(2019년 7월)

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

3.4.1(2019년 5월)

이번 소규모 업데이트는 Android 스튜디오 3.4.1을 지원하고 다양한 버그 수정 및 성능 개선을 포함합니다. 중요한 버그 수정 목록을 보려면 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.2(2019년 3월)

이번 소규모 업데이트는 Android 스튜디오 3.3.2를 지원하고 다양한 버그 수정 및 성능 개선을 포함합니다. 중요한 버그 수정 목록을 보려면 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로 설정하면 플러그인은 단위 테스트를 실행하기 전에 리소스와 애셋, manifest 병합을 이행합니다. 그런 다음 테스트에서 다음 키가 있는지 클래스 경로의 com/android/tools/test_config.properties를 검사할 수 있습니다.
    • android_merged_assets: 병합된 assets 디렉터리의 절대 경로입니다.

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

    • android_merged_manifest: 병합된 manifest 파일의 절대 경로입니다.
    • android_merged_resources: 모듈의 모든 리소스 및 모든 종속성을 포함하는 병합된 리소스 디렉터리의 절대 경로입니다.
    • android_custom_package: 최종 R 클래스의 패키지 이름입니다. 동적으로 애플리케이션 ID를 수정하면 이 패키지 이름이 앱의 manifest에 있는 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()을 사용하여 각 변형의 manifest 파일을 얻을 수 없습니다. 자세한 내용은 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 플래그 지원을 추가하여 기기에 앱을 설치할 때 앱의 크기를 줄일 수 있습니다. 앱 manifest의 <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 + 1024 MB 값으로 설정해야 합니다. 예를 들어 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 종속성이 중복되는 문제가 해결되었습니다.

이전 출시