Android Gradle 플러그인 4.0에는 Gradle 빌드에서 Kotlin 사용을 위한 지원이 추가되었습니다. 프로그래밍 언어인 Groovy를 대체하기 위해 Gradle 구성 파일에서 사용됩니다.
Gradle 스크립트를 작성할 때 Groovy보다 Kotlin이 선호됩니다. Kotlin은 더 읽기 쉬우며 더 나은 컴파일 시간 확인과 IDE 지원을 제공합니다.
현재 Kotlin은 Android 스튜디오 코드에 더 나은 통합을 제공하지만 Kotlin을 사용한 빌드가 Groovy에 비해 빌드 성능을 고려하시기 바랍니다. 마이그레이션할 수 있습니다
이 페이지에서는 Android 앱의 Groovy에서 Kotlin으로 Gradle 빌드 파일 보다 포괄적인 마이그레이션 자세한 내용은 Gradle의 공식 문서를 참고하세요.
타임라인
Android 스튜디오 Giraffe부터 새 프로젝트에서 Kotlin DSL을 사용합니다.
(build.gradle.kts
)가 기본 설정됩니다. 이렇게 하면
Groovy DSL (build.gradle
)보다 더 우수한 편집 환경입니다.
코드 완성, 선언으로 이동 등의
기능을 활용할 수 있습니다 자세히 알아보려면
자세한 내용은
Gradle Kotlin DSL 입문서.
일반적인 용어
Kotlin DSL: Android Gradle 플러그인 Kotlin DSL을 나타내는 경우가 대부분이나 기본 Gradle Kotlin DSL을 나타내는 경우도 있습니다.
이 이전 가이드에서는 'Kotlin DSL' 서로 바꿔서 사용됩니다. 마찬가지로 'Groovy'는 'Groovy DSL' 서로 바꿔서 사용됩니다.
스크립트 파일 이름 지정
스크립트 파일 확장자 이름은 빌드 파일이 작성된 언어를 기반으로 합니다.
- Groovy로 작성된 Gradle 빌드 파일은
.gradle
파일 이름 확장자를 사용합니다. - Kotlin으로 작성된 Gradle 빌드 파일은
.gradle.kts
파일 이름 확장자를 사용합니다.
문법 변환
Groovy와 Kotlin의 문법에는 일반적인 차이점이 몇 가지 있으므로 빌드 스크립트 전체에 이러한 변경사항을 적용해야 합니다.
메서드 호출에 괄호 추가
Groovy를 사용하면 메서드 호출에서 괄호를 생략할 수 있지만 Kotlin에서는 괄호가 필요합니다. 구성을 이전하려면 이러한 종류의 메서드 호출에 괄호를 추가합니다. 다음 코드는 Groovy에서 설정을 구성하는 방법을 보여줍니다.
compileSdkVersion 30
다음은 Kotlin으로 작성된 동일한 코드입니다.
compileSdkVersion(30)
할당 호출에 =
추가
Groovy DSL을 사용하면 다음 경우에 할당 연산자 =
를 생략할 수 있습니다.
속성 할당이 필요하지만 Kotlin은 그것이 필요합니다. 다음 코드는 Groovy에서 속성을 할당하는 방법을 보여줍니다.
java {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
다음 코드는 Kotlin에서 속성을 할당하는 방법을 보여줍니다.
java {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
문자열 변환
다음은 Groovy와 Kotlin의 문자열 차이점입니다.
- 문자열의 큰따옴표: Groovy에서는 작은따옴표를 사용하여 문자열을 정의할 수 있지만 Kotlin에서는 큰따옴표가 필요합니다.
-
점으로 구분된 표현식의 문자열 보간 유형: Groovy에서는 점으로 구분된 표현식의 문자열 보간 유형에
$
접두사만 사용할 수 있지만 Kotlin에서는 점으로 구분된 표현식을 중괄호로 묶어야 합니다. 예를 들어 Groovy에서는 다음 스니펫과 같이$project.rootDir
을 사용할 수 있습니다.myRootDirectory = "$project.rootDir/tools/proguard-rules-debug.pro"
그러나 Kotlin에서는 위 코드가
project.rootDir
이 아닌project
에서toString()
을 호출합니다. 루트 디렉터리의 값을 가져오려면${project.rootDir}
표현식을 중괄호로 묶습니다.myRootDirectory = "${project.rootDir}/tools/proguard-rules-debug.pro"
자세한 내용은 Kotlin 문서의 문자열 템플릿을 참고하세요.
파일 확장자 이름 바꾸기
콘텐츠를 이전할 때 각 빌드 파일에 .kts
를 추가합니다. 예를 들어 settings.gradle
파일과 같은 빌드 파일을 선택합니다. 파일 이름을 다음으로 바꿉니다.
settings.gradle.kts
하고 파일 콘텐츠를 Kotlin으로 변환합니다. 각 빌드 파일을 이전한 후에도 프로젝트가 여전히 컴파일되는지 확인합니다.
가장 작은 파일을 먼저 이전하여 경험을 쌓은 후 계속 진행하세요. 다음과 같은 작업을 할 수 있습니다. 프로젝트에 Kotlin과 Groovy 빌드 파일이 혼합되어 있어야 합니다. 조심스럽게 이동하세요.
def
를 val
또는 var
로 바꾸기
def
를 Kotlin에서 변수를 정의하는 방법인 val
또는 var
로 바꿉니다.
다음은 Groovy에서의 변수 선언입니다.
def building64Bit = false
다음은 Kotlin으로 작성된 동일한 코드입니다.
val building64Bit = false
불리언 속성 앞에 is
추가
Groovy는 속성 공제 로직을 사용함
기반으로 합니다. 불리언 속성 foo
의 경우 추론된 메서드는 getFoo
또는 setFoo
, isFoo
일 수 있습니다. 따라서 Kotlin으로 변환되면 속성 이름을 Kotlin에서 지원하지 않는 추론 메서드로 변경해야 합니다. 예를 들어 buildTypes
DSL 불리언 요소의 경우 is
를 앞에 붙여야 합니다. 다음 코드는 Groovy에서 불리언 속성을 설정하는 방법을 보여줍니다.
android {
buildTypes {
release {
minifyEnabled true
shrinkResources true
...
}
debug {
debuggable true
...
}
...
다음은 Kotlin의 동일한 코드입니다. 속성에는 is
라는 접두사가 붙습니다.
android {
buildTypes {
getByName("release") {
isMinifyEnabled = true
isShrinkResources = true
...
}
getByName("debug") {
isDebuggable = true
...
}
...
목록 및 지도 변환
Groovy와 Kotlin의 목록과 지도는 다른 문법을 사용하여 정의됩니다. Groovy는 []
를 사용하는 반면 Kotlin은 listOf
또는 mapOf
를 사용하여 컬렉션 생성 메서드를 명시적으로 호출합니다. 이전할 때 []
를 listOf
또는 mapOf
로 바꿔야 합니다.
다음은 Groovy에서 목록을 정의하는 방법입니다.
jvmOptions += ["-Xms4000m", "-Xmx4000m", "-XX:+HeapDumpOnOutOfMemoryError</code>"]
다음은 Kotlin으로 작성된 동일한 코드입니다.
jvmOptions += listOf("-Xms4000m", "-Xmx4000m", "-XX:+HeapDumpOnOutOfMemoryError")
다음은 Groovy에서 지도를 정의하는 방법입니다.
def myMap = [key1: 'value1', key2: 'value2']
다음은 Kotlin으로 작성된 동일한 코드입니다.
val myMap = mapOf("key1" to "value1", "key2" to "value2")
빌드 유형 구성
Kotlin DSL에서는 디버그 빌드 유형과 출시 빌드 유형만 암시적으로 사용할 수 있습니다. 다른 모든 맞춤 빌드 유형은 수동으로 만들어야 합니다.
Groovy에서는 먼저 만들지 않고도 디버그 빌드 유형과 출시 빌드 유형, 기타 특정 빌드 유형을 사용할 수 있습니다. 다음 코드 스니펫은 Groovy에서 debug
, release
, benchmark
빌드 유형이 있는 구성을 보여줍니다.
buildTypes {
debug {
...
}
release {
...
}
benchmark {
...
}
}
Kotlin에서 동일한 구성을 만들려면 다음을 명시적으로 만들어야 합니다.
benchmark
빌드 유형
buildTypes {
debug {
...
}
release {
...
}
register("benchmark") {
...
}
}
buildscript에서 플러그인 블록으로 이전
빌드에서
buildscript {}
드림
프로젝트에 플러그인을 추가할 때
plugins {}
차단하세요. plugins {}
블록을 사용하면 플러그인을 더 쉽게 적용할 수 있습니다.
잘 작동함
버전 카탈로그를 나열하는 것입니다.
또한 빌드 파일에서 plugins {}
블록을 사용하면
Android 스튜디오는 빌드가 실패하더라도 컨텍스트를 인식합니다. 이 컨텍스트
Kotlin DSL 파일을 수정하는 데 도움이 됩니다.
코드 완성을 수행하고 기타 유용한 제안을 제공합니다.
플러그인 ID 찾기
buildscript {}
블록은
Maven 좌표
플러그인의 이름(예: com.android.tools.build:gradle:7.4.0
)
plugins {}
블록은 대신 플러그인 ID를 사용합니다.
대부분의 플러그인에서 플러그인 ID는
apply plugin
예를 들어 다음 플러그인 ID는
Android Gradle 플러그인:
com.android.application
com.android.library
com.android.lint
com.android.test
전체 플러그인 목록은 다음 페이지에서 확인할 수 있습니다. Google Maven 저장소.
Kotlin 플러그인은 여러 플러그인 ID로 참조할 수 있습니다. 이때 네임스페이스화된 플러그인 ID로, 약식에서 네임스페이스화된 플러그인 ID로 다음 표를 참조하세요.
약식 플러그인 ID | 네임스페이스화된 플러그인 ID |
---|---|
kotlin |
org.jetbrains.kotlin.jvm |
kotlin-android |
org.jetbrains.kotlin.android |
kotlin-kapt |
org.jetbrains.kotlin.kapt |
kotlin-parcelize |
org.jetbrains.kotlin.plugin.parcelize |
또한 Gradle 플러그인 포털, Maven 중앙 저장소 및 Google Maven 저장소. 읽기 맞춤 Gradle 플러그인 개발 플러그인 ID의 작동 방식에 대해 알아보시기 바랍니다.
리팩터링 실행
사용하는 플러그인 ID를 확인한 후 다음 단계를 따르세요.
buildscript {}
에 선언된 플러그인의 저장소가 아직 있는 경우settings.gradle
블록으로 이동 파일을 대신 사용하세요.최상위 수준의
plugins {}
블록에 플러그인 추가build.gradle
파일. 이 경우 광고 항목의 ID와 확인할 수 있습니다 플러그인에서 자동으로 루트 프로젝트에 적용하려면apply false
를 사용합니다.최상위
build.gradle.kts
파일에서classpath
항목을 삭제합니다.plugins {}
블록에 플러그인을 추가하여 적용합니다. 모듈 수준build.gradle
파일. 플러그인의 버전이 루트 프로젝트에서 상속되기 때문입니다.모듈 수준에서 플러그인의
apply plugin
호출을 삭제합니다.build.gradle
파일.
예를 들어 이 설정에서는 buildscript {}
블록을 사용합니다.
// Top-level build.gradle file
buildscript {
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
dependencies {
classpath("com.android.tools.build:gradle:7.4.0")
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.0")
...
}
}
// Module-level build.gradle file
apply(plugin: "com.android.application")
apply(plugin: "kotlin-android")
다음은 plugins {}
블록을 사용하는 것과 동일한 설정입니다.
// Top-level build.gradle file
plugins {
id 'com.android.application' version '7.4.0' apply false
id 'org.jetbrains.kotlin.android' version '1.8.0' apply false
...
}
// Module-level build.gradle file
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
...
}
// settings.gradle
pluginManagement {
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}
플러그인 블록 변환
plugins {}
블록에서 플러그인을 적용하는 것은 Groovy와 Kotlin에서 비슷합니다.
다음 코드는 Groovy에서 플러그인을 사용할 때
버전 카탈로그를 참고하세요.
// Top-level build.gradle file
plugins {
alias libs.plugins.android.application apply false
...
}
// Module-level build.gradle file
plugins {
alias libs.plugins.android.application
...
}
다음 코드는 Kotlin에서 동일한 작업을 실행하는 방법을 보여줍니다.
// Top-level build.gradle.kts file
plugins {
alias(libs.plugins.android.application) apply false
...
}
// Module-level build.gradle.kts file
plugins {
alias(libs.plugins.android.application)
...
}
다음 코드는 코드를 실행하지 않을 때 Groovy에서 플러그인을 적용하는 방법을 보여줍니다. 다음 안내를 따르세요.
// Top-level build.gradle file
plugins {
id 'com.android.application' version '7.3.0' apply false
...
}
// Module-level build.gradle file
plugins {
id 'com.android.application'
...
}
다음 코드는 Kotlin에서 동일한 작업을 실행하는 방법을 보여줍니다.
// Top-level build.gradle.kts file
plugins {
id("com.android.application") version "7.3.0" apply false
...
}
// Module-level build.gradle.kts file
plugins {
id("com.android.application")
...
}
plugins {}
블록에 대한 자세한 내용은 적용
플러그인
참조하세요.
기타
다른 기능의 Kotlin 코드 샘플은 다음 문서 페이지를 참고하세요.
- ProGuard 구성이 있는 경우 축소, 난독화, 최적화 사용 설정을 참고하세요.
signingConfig {}
블록이 있다면 빌드 파일에서 서명 정보 삭제를 참고하세요.- 프로젝트 범위의 속성을 사용하는 경우 프로젝트 범위 속성 구성을 참고하세요.
알려진 문제
현재 알려진 문제는 빌드 속도가 Groovy를 사용할 때보다 Kotlin의 빌드 속도가 더 느릴 수 있다는 점입니다.
문제 신고 방법
문제를 분류하는 데 필요한 정보를 제공하는 방법은 빌드 도구 및 Gradle 버그 세부정보를 참고하세요. 그런 다음 Google 공개 Issue Tracker를 사용하여 버그를 신고합니다.
추가 리소스
Kotlin으로 작성된 Gradle 빌드 파일의 실제 예는 다음을 참고하세요. Now In Android 샘플 앱 를 참조하세요.