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 | 4.1 | 자세한 내용은 Gradle 업데이트하기를 참고하세요. |
SDK 빌드 도구 | 26.0.2 | 26.0.2 | SDK 빌드 도구를 설치 또는 구성합니다. 이 업데이트를 통해 빌드 도구의 버전을 더 이상 지정하지 않아도 됩니다. 플러그인은 필요한 최소 버전을 기본적으로 사용합니다. 따라서 이제 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에서 이전을 읽어보세요.