build.gradle - Kotlin DSL와 Catalog로 마이그레이션하기 #1

이제일·2023년 8월 8일
0

Android

목록 보기
13/15

Kotlin으로 마이그레이션하기

기존에는 build.gradle의 언어로 Groovy를 사용했었는데
최근 구글이 Android의 새로운 빌드 언어로 Kotlin DSL을 채택했습니다

Kotlin DSL이 뭐가 좋은지, 어떻게 사용하는지 알아봅시다

Kotlin DSL, 굳이?

Kotlin DSL의 장점은 다음과 같다.

  1. 간결하고 가독성이 높은 코드
  2. 자동 완성, 오류 코드 강조 등의 IDE 지원
  3. 유연성과 확장성
  4. Kotlin의 기능 활용
  5. 빠른 문서보기 가능

아래는 가이드에서 발췌한 내용입니다.

Android Gradle 플러그인 4.0은 Gradle 구성 파일에서 전통적으로 사용되는 프로그래밍 언어인 Groovy를 대신하여 Gradle 빌드 구성에서 Kotlin을 사용하기 위한 지원을 추가했습니다.
Kotlin은 더 읽기 쉽고 더 나은 컴파일 시간 검사 및 IDE 지원을 제공하기 때문에 Gradle 스크립트를 작성하는 데 Groovy보다 선호됩니다.
현재 Kotlin은 Groovy와 비교할 때 Android Studio의 코드 편집기에서 더 나은 통합을 제공하지만 Kotlin을 사용한 빌드는 Groovy를 사용한 빌드보다 느린 경향이 있으므로 마이그레이션 여부를 결정할 때 빌드 성능을 고려하십시오.

단점으로는 빌드 속도가 느릴 수 있다는 것이다.

변환 방법

먼저 기존 *.gradle의 확장자 명을 *.gradle.ktx로 변경한다

스크립트 파일 확장자 이름은 빌드 파일이 작성된 언어를 기반으로 한다.
Groovy로 작성된 Gradle 빌드 파일은 .gradle파일 확장명을 사용하고
Kotlin으로 작성된 Gradle 빌드 파일은 .gradle.kts 파일 이름 확장자를 사용

구문으로는 다음 규칙을 적용한다

  • 메서드 호출에 괄호 추가
  • = 할당 호출 추가
  • 문자열 ''""
  • 변수 정의 defval or var로 변경
  • boolean형 속성에 is 접두사 추가
  • 목록 정의 변경

  • 메서드 호출에 괄호 추가
// groovy
compileSdkVersion 30

// kotlin
compileSdkVersion(30)
  • = 할당 호출 추가
// groovy
java {
    sourceCompatibility JavaVersion.VERSION_17
    targetCompatibility JavaVersion.VERSION_17
}

// kotlin
java {
    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
}
  • 문자열 ''""
// groovy
myRootDirectory = "$project.rootDir/tools/proguard-rules-debug.pro"
    
// kotlin
myRootDirectory = "${project.rootDir}/tools/proguard-rules-debug.pro"
  • 변수 정의 defval or var로 변경
// groovy
def building64Bit = false

// kotlin
val building64Bit = false
  • boolean형 속성에 is 접두사 추가
// groovy
android {
    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            ...
        }
        debug {
            debuggable true
            ...
        }
    ...
}
    
// kotlin
android {
    buildTypes {
        getByName("release") {
            isMinifyEnabled = true
            isShrinkResources = true
            ...
        }
        getByName("debug") {
            isDebuggable = true
            ...
        }
    ...
}
  • 목록 정의 변경
// groovy
jvmOptions += ["-Xms4000m", "-Xmx4000m", "-XX:+HeapDumpOnOutOfMemoryError</code>"]

// kotlin
jvmOptions += listOf("-Xms4000m", "-Xmx4000m", "-XX:+HeapDumpOnOutOfMemoryError")

BuildSrc?

의존성 관리와 IDE 자동완성 지원을 위해 kotlin 코드를 가지는 buildSrc 모듈을 만들 수 있다.
이러한 Kotlin DSL과 buildSrc를 사용하면 더 편리하게 의존성을 관리할 수 있다.

Gradle 문서를 보면

Gradle이 수행되면 buildSrc 디렉터리가 존재하는지 체크한다.
이 경우 Gradle은 자동적으로 코드를 컴파일하고 테스트한 뒤 당신의 빌드 스크립트의 classpath에 넣는다.
이 방법은 유지 보수, 리팩터링 및 코드 테스트가 더 쉽다.

즉, buildSrc는 빌드 로직을 포함할 수 있는 Gradle 프로젝트 루트 디렉터리로
buildSrc과 Kotlin DSL을 사용해서 적은 구성으로 커스텀 빌드 코드를 작성하고,
전체 프로젝트에서 이 로직을 공유할 수 있다.

하지만 buildSrc를 변경하게 되면 전체 프로젝트의 빌드 캐시가 무효화되면서
빌드 속도가 느려지기 때문에 잦은 수정을 피해야 한다.


적용하기

BuildSrc를 적용하기위해

먼저 파일을 만든다
루트 아래에 buildSrc 디렉토리를 만들어서 build.gradle.kts을 추가하고,
해당 폴더의 하위 디렉토리 src/main/kotlin 에는 예시로 Versions라는 클래스를 추가한다.

build.gradle.kts에는 다음 문구를 입력한다

plugins {
    `kotlin-dsl`
}

Versions라는 클래스에는 다음과 같이 버전을 기록한다.

object Versions {
    const val kotlin = "1.4.31"
}

모듈 레벨에서 사용은 다음과 같다.

dependencies {
    implementation("org.jetbrains.kotlin:kotlin-stdlib:$kotlin")
}

build 캐시는 git에서 관리하지 않도록 다음의 내용을 .ignore에 추가하자
buildSrc/build

위 파일은 buildSrc 하위에 넣은 Dependency 파일이다.
Gradle은 자동적으로 위 코드를 컴파일하고 테스트한 뒤, 빌드 스크립트의 classpath에 넣는다.


Catalog

내용이 길어져 Catalog 부분은 다음 장에서 진행하겠습니다!

참고 레퍼런스

https://developer.android.com/build/migrate-to-kotlin-dsl
https://docs.gradle.org/current/userguide/migrating_from_groovy_to_kotlin_dsl.html

profile
세상 제일 이제일

1개의 댓글

comment-user-thumbnail
2023년 8월 8일

좋은 글 감사합니다. 자주 올게요 :)

답글 달기