Android Gradle Plugin 3.1.2 마이그레이션
buildToolsVersion
새로운 android gradle plugin 3.x를 사용하면 더 이상 빌드 도구의 버전을 지정할 필요가 없습니다 (이제 android.buildToolsVersion 속성을 제거 할 수 있습니다).
Gradle 3.x 이상에서는 사용중인 Android 플러그인 버전에 필요한 최소 Build Tools Version을 자동으로 사용합니다.
- Android Plugin for Gradle Release Notes
- Android Studio 3.0: buildToolsVersion not found in gradle files
기본적으로 플러그인은 사용중인 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/