Android Gradle 플러그인 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 파일로 컴파일되며 수정된 클래스만 다시 덱싱됩니다. minSdkVersion을 20 이하로 설정하고 레거시 멀티덱스를 사용하는 앱의 빌드 속도도 개선됩니다.
  • 특정 작업을 최적화함으로써 빌드 속도를 개선하여 캐시된 출력을 사용합니다. 이 최적화의 이점을 얻으려면 먼저 Gradle 빌드 캐시를 사용 설정해야 합니다.
  • AAPT2를 사용하여 증분 리소스 처리를 개선하며 이제 이것은 기본적으로 사용 설정됩니다. AAPT2를 사용하는 동안 문제가 발생하면 버그를 신고하세요. gradle.properties 파일에 android.enableAapt2=false를 설정하고 명령줄에서 ./gradlew --stop을 실행하여 Gradle 데몬을 다시 시작함으로써 AAPT2를 사용 중지할 수도 있습니다.

새로운 기능

  • 변형 인식 종속 항목 관리. 모듈의 특정 변형을 빌드할 때 이제 플러그인이 로컬 라이브러리 모듈 종속 항목의 변형을 빌드 중인 모듈의 변형과 자동으로 일치시킵니다.
  • 새로운 기능 모듈 플러그인을 포함하여 Android 인스턴트 앱SDK Manager를 사용해 다운로드할 수 있는 Android 인스턴트 앱 SDK를 지원합니다. 새로운 플러그인으로 기능 모듈을 생성하는 방법에 관한 자세한 내용은 여러 기능이 있는 인스턴트 앱의 구조를 읽어보세요.
  • 특정 Java 8 언어 기능 및 Java 8 라이브러리 사용을 위한 기본적인 지원이 제공됩니다. 이제 Jack은 지원 중단되고 더 이상 필요하지 않으므로 먼저 Jack을 사용 중지하여 기본 도구 모음에 빌드된 개선된 자바 8 지원을 사용해야 합니다. 자세한 내용은 자바 8 언어 기능 사용을 읽어보세요.
  • Android Test Orchestrator로 실행하는 테스트를 추가로 지원하여 앱의 자체 Instrumentation 호출 내에서 각 앱의 테스트를 실행할 수 있습니다. 각 테스트는 자체 Instrumentation 인스턴스에서 실행되므로 테스트 간의 공유 상태가 기기의 CPU나 메모리에 누적되지 않습니다. 테스트 하나가 비정상 종료되더라도 자체 Instrumentation 인스턴스만 중단하므로 다른 테스트는 계속 실행됩니다.

    • testOptions.execution을 추가하여 기기 내 테스트 조정의 사용 여부를 판단합니다. Android Test Orchestrator를 사용하려면 아래와 같이 ANDROID_TEST_ORCHESTRATOR를 지정해야 합니다. 이 속성은 기본적으로 HOST로 설정되며, 이는 기기 내 조정을 사용 중지하고 테스트를 실행하는 표준 메서드입니다.

    Groovy

            android {
              testOptions {
                execution 'ANDROID_TEST_ORCHESTRATOR'
              }
            }
            

    Kotlin

            android {
              testOptions {
                execution = "ANDROID_TEST_ORCHESTRATOR"
              }
            }
            
  • 새로운 androidTestUtil 종속 항목 구성으로 Android Test Orchestrator와 같은 계측 테스트를 실행하기 전에 다른 테스트 도우미 APK를 설치할 수 있습니다.

    Groovy

            dependencies {
              androidTestUtil 'com.android.support.test:orchestrator:1.0.0'
              ...
            }
            

    Kotlin

            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를 지원합니다.
  • 이제 아래와 같이 외부 네이티브 빌드 프로젝트의 출력 디렉터리를 변경할 수 있습니다.

    Groovy

            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"
                    }
                }
            }
            

    Kotlin

            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 구성을 사용하여 린트 프로젝트에 종속될 수 있습니다.

    Groovy

            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')
            }
            

    Kotlin

            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를 삭제하여 이를 사용하면 빌드가 손상됩니다. 예를 들어 더 이상 Variants API를 사용하여 outputFile() 객체에 액세스하거나 processManifest.manifestOutputFile()을 사용하여 각 변형의 매니페스트 파일을 얻을 수 없습니다. 자세한 내용은 API 변경사항을 읽어보세요.
  • 더 이상 빌드 도구의 버전을 지정할 필요가 없으므로 이제 android.buildToolsVersion 속성을 삭제할 수 있습니다. 기본적으로 플러그인은 사용 중인 Android 플러그인 버전에 필요한 빌드 도구의 최소 버전을 자동으로 사용합니다.
  • 이제 아래와 같이 buildTypes 블록에서 PNG 크런칭을 사용 설정/중지합니다. PNG 크런칭은 디버그 빌드를 제외한 모든 빌드에 기본적으로 사용 설정되는데 그 이유는 많은 PNG 파일을 포함한 프로젝트의 빌드 시간이 증가하기 때문입니다. 따라서 다른 빌드 유형의 빌드 시간을 개선하려면 PNG 크런칭을 사용 중지하거나 이미지를 WebP로 변환해야 합니다.

    Groovy

          android {
            buildTypes {
              release {
                // Disables PNG crunching for the release build type.
                crunchPngs false
              }
            }
          }
          

    Kotlin

          android {
            buildTypes {
              release {
                // Disables PNG crunching for the release build type.
                isCrunchPngs = false
              }
            }
          }
          
  • 이제 Android 플러그인이 외부 CMake 프로젝트에서 구성한 실행 가능한 타겟을 자동으로 빌드합니다.
  • 이제 annotationProcessor 종속 항목 구성을 사용하여 프로세서 클래스 경로에 주석 프로세서를 추가해야 합니다.
  • 지원 중단된 ndkCompile 사용이 더 제한됩니다. 대신 APK로 패키징하려는 네이티브 코드를 컴파일하도록 CMake나 ndk-build를 사용하여 이전해야 합니다. 자세한 내용은 ndkcompile에서 이전을 읽어보세요.