IT_Programming/Dev Tools

[펌] Android Weekly #281 : Migrate to Android Plugin for Gradle 3.0.0

JJun ™ 2017. 12. 11. 00:31



 출처

 : https://medium.com/@kimtaesoo188/android-weekly-281-migrate-to-android-plugin-for-gradle-3-0-0-4ca84c2f544




Android Weekly #281 : Migrate to Android Plugin for Gradle 3.0.0

원문은 여기

Android Plugin for Gradle 3.0.0은 large multi-module project 에 상당한 성능 향상을 가져 오는 Major upgrade입니다

Project를 migration 한 후에는 다음 성능 향상의 이점을 누릴 수 있습니다.

  • ● 세분화 된 작업 graph를 통해 multi-module project의 병렬 처리가 향상되었습니다.
  • ●  Variant-aware dependency management. 특정 variant of a module을 빌드 할 때 plugin 은 자동으로 로컬 라이브러리 모듈 종속성의 variants을 현재 빌드중인 모듈의 variants과 일치시킵니다.
  • ●  dependency을 변경할 때 Gradle은 해당 종속성 API에 액세스 할 수없는 모듈을 다시 컴파일하지 않아도 빠른 빌드를 수행합니다.
  • ●  per-class dexing 으로 인해 빌드 속도가 빨라집니다. 각 Class는 이제 별도의 DEX 파일로 컴파일되고 수정 된 Class만 다시 컴파일됩니다. 또한 minSdkVersion 20 이하이고 legacy multi-dex를 사용하는 경우 향상된 빌드 속도도 기대해야 합니다.

업데이트 및 변경 사항에 대한 전체 목록을 보려면 Android 플러그인 3.0.0 릴리스 노트를 읽어보십시오.

현재 처리중인 문제에 대한 자세한 내용은 알려진 문제를 참조하십시오.

Update Gradle version

Android 플러그인 3.0.0에는 Gradle 버전 4.1 이상이 필요합니다. Android Studio 3.0 이상을 사용하여 기존 프로젝트를 여는 경우 프롬프트에 따라 기존 프로젝트를 호환되는 버전의 Gradle로 자동 업데이트하십시오.

수동으로 Gradle을 업데이트하려면 gradle-wrapper.properties의 URL을 다음과 같이 편집하십시오.

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

Apply the plugin

Android Studio 3.0 이상을 사용하여 기존 프로젝트를 여는 중이면 프롬프트에 따라 프로젝트를 최신 Android 플러그인 버전으로 자동 업데이트하십시오. 프로젝트를 수동으로 업데이트하려면 다음과 같이 maven repo를 포함하고 프로젝트 레벨 build.gradle 파일의 플러그인 버전을 변경하십시오.

buildscript {
repositories {
...
// You need to add the following repository to download the
// new plugin.
google()
}

dependencies {
classpath 'com.android.tools.build:gradle:3.0.0'
}
}
Note : multi-module 과 composite builds의 경우 Android 플러그인이 빌드 당 두 번 이상로드되면 빌드 오류가 발생할 수 있습니다. 자세한 내용은 알려진 문제를 읽어보십시오.

Use variant-aware dependency management

Android 플러그인 3.0.0 이상에는 라이브러리를 사용할 때 자동으로 변형과 일치하는 새로운 종속성 메커니즘이 포함되어 있습니다. 이는 앱의 debugvariant이 라이브러리의 debugvariant을 자동으로 사용한다는 것을 의미합니다. 또한 flavors를 사용할 때도 작동합니다. 앱의 freeDebug variant은 라이브러리의 freeDebug variant을 사용합니다.

plugin이 variants과 정확하게 일치하도록하려면 모든 product의 variants에 대한 declare variants dimensions. 직접 일치가 불가능한 경우에 대한 provide matching fallbacks 해야 합니다.

Declare flavor dimensions

이제 plugin은 single dimension 만 사용하려는 경우에도 모든 flavors가 명명된 flavor dimension에 속해야합니다. 그렇지 않으면 다음 빌드 오류가 발생합니다.

Error:All flavors must now belong to a named flavor dimension.
The flavor 'flavor_name' is not assigned to a flavor dimension.

이 오류를 해결하려면 flavorDimensions 속성을 사용하여 하나 이상의 dimensions을 먼저 선언해야합니다.

그런 다음 아래 예제와 같이 선언 된 dimensions 중 하나에 각 flavor을 지정합니다. plugin이 자동으로 종속성을 일치시키기 때문에 flavor dimensions의 이름을 신중하게 지정해야합니다.

// Specifies two flavor dimensions.
flavorDimensions "tier", "minApi"

productFlavors {
free {
// Assigns this product flavor to the "tier" flavor dimension. Specifying
// this property is optional if you are using only one dimension.
dimension "tier"
...
}

paid {
dimension "tier"
...
}

minApi23 {
dimension "minApi"
...
}

minApi18 {
dimension "minApi"
...
}
}

Resolve build errors related to dependency matching

App이 “staging”이라는 빌드 유형을 구성하지만 라이브러리 종속성 중 하나가 그렇지 않은 경우를 고려하십시오. Plugin이 앱의 ‘staging’버전을 빌드하려고하면 사용할 라이브러리 버전을 알 수 없으며 다음과 유사한 오류 메시지가 표시됩니다.

Error:Failed to resolve: Could not resolve project :mylibrary.
Required by:
project :app

플러그인에는 DSL 요소가 포함되어있어 앱과 종속성 간의 직접 variant이 일치하지 않는 상황을 Gradle이 어떻게 해결해야하는지 제어 할 수 있습니다. 변형 인식 종속성 일치와 관련된 특정 빌드 오류를 해결하는 데 사용해야하는 DSL 등록 정보를 결정하려면 아래 표를 참조하십시오.

provide matching fallbacks