Android

Kotlin DSL (2) - Groovy DSL에서 Kotlin DSL로 이관

c0de_h0ng 2022. 12. 13. 23:32
728x90

Kotlin DSL로 이관해야 할 Gradle 목록

  • 앱 레벨 build.gradle
  • 프로젝트 레벨 build.gradle
  • settings.gradle

이관 순서는 정해져있지는 않지만 경험상 모듈 레벨 아래와 같은 순서로 작업하면 수월하다.

  1. 모듈 레벨 build.gradle
  2. 프로젝트 레벨 build.gradle
  3. settings.gradle

build.gradle 확장자 수정

build.gradle 파일명에.kts를 붙여 아래와 같이 확장자를 변경한다.

build.gradle -> build.gradle.kts
settings.gradle -> settings.gradle.kts

확장자를 변경하게 되면 아래 스크린샷과 같이 build.gradle 아이콘이 변경된 것을 확인 할 수 있다.

안드로이드 스튜디오 버전 및 환경에 따라 확장자를 변경하게 되면 작성 코드들이 에러로 뜨는 경우도 있지만 아무런 변화가 없으면서 sync now 하거나 빌드를 하면 에러가 나올 수 있다.

이제부터 대표적인 것을 예를 들어서 천천히 적용해보자.

모듈 레벨 build.gradle Kotlin DSL 이관

plugins 적용

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'com.google.gms.google-services'

Groovy DSL

plugins {    
    id("com.android.application")
    kotlin("android")
    kotlin("kapt")
    id("com.google.gms.google-services")
}

Kotlin DSL

여기서 코틀린에 관한 plugin은 id() 대신 kotlin()을 사용할 수 있다.

android 적용

android {
  compileSdkVersion 31
}

Groovy DSL

android {
  compileSdkVersion(31)
}

Kotlin DSL

이렇게 수정한 후 Gradle 싱크를 맞춰주면 해당 Gradle 파일은 이제 완전히 Kotlin으로 탈바꿈하게 된다.

applicationId, version_code, version_name 적용

ext {
    applicationId = "com.example.codehong"
}

def version_code = 1
def version_name = "1.0"

Groovy DSL

val applicationId = "com.example.codehong"
val version_code = 1
val version_name = "1.0"

Kotlin DSL

ext { }, def로 선언된 상수들은 모두 val로 바꿔준다.

maven 적용

maven { url "https://maven.google.com" }

Groovy DSL

maven("https://maven.google.com")

Kotlin DSL

implementation, kapt, exclude 적용

implementation "com.facebook.shimmer:shimmer:0.5.0"

implementation fileTree(include: ['*.jar'], dir: 'libs')

kapt "androidx.room:room-compiler:$room_version"

exclude 'META-INF/DEPENDENCIES.txt'

Groovy DSL

implementation("com.facebook.shimmer:shimmer:0.5.0")

implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))

kapt ("androidx.room:room-compiler:$room_version")

exclude("META-INF/DEPENDENCIES.txt")

Kotlin DSL

defaultConfig 적용

defaultConfig {
    applicationId "com.example.codehong"
    minSdkVersion 21
    targetSdkVersion 31
    versionCode 1
    versionName "1.0"
    ...

Groovy DSL

defaultConfig {
    applicationId = "com.example.codehong"
    minSdkVersion(21)
    targetSdkVersion(31)
    versionCode(1)
    versionName("1.0")
    ...

Kotlin DSL

sourceSets 적용

sourceSets {
    main {
       aidl.srcDirs = ['src/main/java']
    }
}

Groovy DSL

sourceSets {
    getByName("main") {
        aidl.srcDirs("src/main/java")
     }
}

Kotlin DSL

signingConfigs 적용

signingConfigs {
    release {
        def keystorePropertiesFile = rootProject.file('***.properties')
        def keystoreProperties = new Properties()
        keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

        storeFile file(keystoreProperties['storeFile'])
        storePassword keystoreProperties['storePassword']
        keyAlias keystoreProperties['keyAlias']
        keyPassword keystoreProperties['keyPassword']
    }
}

Groovy DSL

signingConfigs {
    create("release") {
        val keystorePropertiesFile = rootProject.file("***.properties")
        val keystoreProperties = Properties()
        keystoreProperties.load(FileInputStream(keystorePropertiesFile))

        storeFile = file(keystoreProperties["storeFile"] ?: "")
        storePassword = keystoreProperties["storePassword"] as String
        keyAlias = keystoreProperties["keyAlias"] as String
        keyPassword = keystoreProperties["keyPassword"] as String
    }
}

Kotlin DSL

FileInputStreamjava.util.*  import가 필요하다.

import java.io.FileInputStream
import java.util.*

productFlavors 적용

dev {
  applicationIdSuffix ".dev"
  manifestPlaceholders = [appId: "${appId}", appName: "${appName}"]
}

Groovy DSL

create("dev") {
    applicationIdSuffix(".dev")
    manifestPlaceholders(
        mapOf(
          "appId" to "${appId}",
          "appName" to "${appName}"
        )
    )
}

Kotlin DSL

buildTypes 적용

buildTypes {
    release {
        minifyEnabled true
        shrinkResources false
    
        proguardFiles 'proguard-rules.pro'
    
        signingConfig signingConfigs.release
    }
}

Groovy DSL

buildTypes {
    getByName("release") {
        isMinifyEnabled = true
        isShrinkResources = false
  
        proguardFile("proguard-rules.pro")
  
        signingConfig = signingConfigs.getByName("release")
    }
}

Kotlin DSL

compileOptions, kotlinOptions, buildFeatures 적용

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

kotlinOptions {
    jvmTarget = JavaVersion.VERSION_1_8
}

buildFeatures {
    dataBinding true
    viewBinding true
}
...

Groovy DSL

compileOptions {
    sourceCompatibility(JavaVersion.VERSION_1_8)
    targetCompatibility(JavaVersion.VERSION_1_8)
}

kotlinOptions {
    jvmTarget = JavaVersion.VERSION_1_8.toString()
}

buildFeatures {
    dataBinding = true
    viewBinding = true
}
...

Kotlin DSL

configurations 적용

configurations {
    all*.exclude group: 'xpp3', module: 'xpp3'
}

Groovy DSL

configurations {
    all {
        exclude(group = "xpp3", module = "xpp3")
    }
}

Kotlin DSL

프로젝트 레벨 build.gradle Kotlin DSL 이관

classpath 적용

classpath 'com.android.tools.build:gradle:4.1.0'

Groovy DSL

classpath ("com.android.tools.build:gradle:4.1.0")

Kotlin DSL

settings.gradle Kotlin DSL 이관

include ':app'

Groovy DSL

include(":app")

Kotlin DSL