노블의 개발이야기

[Android] Migrate to Android Plugin for Gradle 3.1.2 본문

Android

[Android] Migrate to Android Plugin for Gradle 3.1.2

더플러스 2018. 5. 25. 10:50

Android Gradle Plugin 3.1.2 마이그레이션

buildToolsVersion

새로운 android gradle plugin 3.x를 사용하면 더 이상 빌드 도구의 버전을 지정할 필요가 없습니다 (이제 android.buildToolsVersion 속성을 제거 할 수 있습니다).

Gradle 3.x 이상에서는 사용중인 Android 플러그인 버전에 필요한 최소 Build Tools Version을 자동으로 사용합니다.

기본적으로 플러그인은 사용중인 Android 플러그인 버전에 필요한 최소 빌드 도구 버전을 자동으로 사용합니다.

Output File

Android Studio error “Cannot set the value of read-only property ‘outputFile’ for ApkVariantOutputImpl_Decorated{apkData=Main{type=MAIN……”’

Offline Work Option

gson, okhttp 등 외부 라이브러리 의존성을 설정하면 다음과 같은 오류가 발생합니다.

Could not resolve all files for configuration ':app:debugCompileClasspath'.
> Could not download gson.jar (com.google.code.gson:gson:2.2.4): No cached version available for offline mode
> Could not download okhttp.jar (com.squareup.okhttp:okhttp:1.5.4): No cached version available for offline mode

해결 방법

  • File > Other Settings > Default Settings > Build, Execution, Deplyment > Build Tools > Gradle > Uncheck Offline work option

Declare flavor dimensions

이제 플러그인은 단일 dimention을 사용하려는 경우에도 모든 flavor가 명명된 flavor dimension에 속해야합니다. 그렇지 않으면 다음과 같은 빌드 오류가 발생합니다.

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

이 오류를 해결하려면 flavorDimentsions 속성을 사용하여 하나 이상의 dimensions을 먼저 선언해야합니다. 그런 다음 아래 예제와 같이 선언된 dimensions 중 하나에 각 flavor를 지정합니다. 플러그인은 자동으로 종속성을 일치시키기 때문에 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"
        ...
    }
}

implementation 와 api의 차이

  • consumers(사용자) : 다른 프로젝트에서 사용하는 Java 혹은 Java Library plugin를 지칭
exporte recompile
api 컴파일을 위해 사용자에게 종속성이 이양됨 종속성이 있는 모든 모듈 재컴파일
implementation 사용자에게 노출되지 않음 접근 가능한 종속성이 있는 모든 모듈 재컴파일

implementation 장점

  • 이양된 종속성에 의해 뜻하지 않은 종속성이 사용자에게 노출되지 않음
  • 컴파일 최적화
  • 명시적인 의존성 관리

결론

  • 3.0에서 컴파일러가 2.0과 동일하게 동작하길 원한다면 api를 사용
  • 오직 Internal에만 사용하는 라이브러리의 경우, implementation 사용
  • 사용자에게 API를 노출시켜야 한다면 api사용

참고

- https://docs.gradle.org/current/userguide/java_library_plugin.html
- https://sikeeoh.github.io/2017/08/28/implementation-vs-api-android-gradle-plugin-3/


Comments