2022. 5. 24. 21:46ㆍandroid
1편에 이어 두 번째 시간입니다.
여기서는 기존의 Gradle 파일을 바꾸는 작업을 하겠습니다.
groovy에서 kotlin으로 변경할 때는 몇 가지 규칙이 있습니다.
https://developer.android.com/studio/build/migrate-to-kts?hl=ko
Groovy에서 KTS로 빌드 구성 이전 | Android 개발자 | Android Developers
Gradle 구성 파일을 Groovy에서 KTS로 이전합니다.
developer.android.com
규칙의 내용은 공식 홈페이지에서 확인이 가능합니다.
But 저것만 보면 조금 이해하기 어렵더라구요.
저랑 같이 한번 실습을 통해 무엇을 어떻게 바꾸는지 한번 확인해보도록 하겠습니다!!
여기서 먼저 settings.gradle을 바꿔주겠습니다. ( 빠르게 Shift + F6 가능)

rename으로 들어가서

파일명 뒤에 .kts 를 쓰고 Refactor 를 누릅니다.

현재 settings.gradle.kts 은 이런 상태입니다
pluginManagement {
repositories {
gradlePluginPortal()
google()
mavenCentral()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
}
}
rootProject.name = "My App"
include ':app' -> include(":app")
맨 밑에 include만
include(":app")
이렇게 변경합니다. 그리고 sync now 합니다.
이제 Project 단위의 build.gradle 파일명도 Refactor를 이용하여
뒤에 .kts 를 써주고 변경하여 줍니다.
여기서 규칙 1을 적용합니다.
규칙 1. ' ' 를 사용하는 애들은 전부 " " 큰따옴표로 바꿔주고 괄호 필수!!!!!!
아래에 내용을 변경해줍니다.
' ' -> (" ")
task도 변경해주세요!
build.gradle.kts(Project: MyApp)
plugins {
id 'com.android.application' version '7.2.0' apply false
id 'com.android.library' version '7.2.0' apply false
id 'org.jetbrains.kotlin.android' version '1.6.21' apply false
id 'org.jetbrains.kotlin.jvm' version '1.6.21' apply false
}
task clean(type: Delete) {
delete rootProject.buildDir
}
안에 있는 plugins 는 각자 앞 글에 1번 방식 혹은 2번 방식에 따라 다르게 될 수 있습니다.
무조건 복붙하시면 어딘가에서 분명 오류가 발생할 수 있으니까 맞춰서 해주셔야 합니다.
plugins {
id ("com.android.application") version "7.2.0" apply false
id ("com.android.library") version "7.2.0" apply false
id ("org.jetbrains.kotlin.android") version "1.6.10" apply false
id ("org.jetbrains.kotlin.jvm") version "1.6.21" apply false
}
tasks.register("clean",Delete::class){
delete(rootProject.buildDir)
}
위에 id 'org.jetbrains.kotlin.jvm' version '1.6.21' apply false 는 module 추가를 통한 방식으로
buildSrc 폴더를 만들면 생성되는 플러그인 id 입니다.
만약 모듈로 생성한게 아닌 프로젝트 폴더에 우클릭 -> Directory 추가를 해서 직접 만들면 없는 플러그인입니다.
그러니 무조건 복붙하시면 안되고 버전 확인하시고 필요한 plugins 만 사용해주세요!! 안그러면 늪에 빠집니다ㅠㅠ
또한 compose로 만들면 좀 달라지는데
compose를 사용하실때는 compose 버전과
플러그인의 id 'org.jetbrains.kotlin.android' version '1.5.31' apply false
version을 잘 맞춰주셔야 합니다.
1.6.xx 이상을 하시면 자동으로 kotlin migration event 알림이 오른쪽 아래에 뜨는데
이때 몇 가지 사항들을 migration 하면 compose 와 충돌이 납니다.
아직 정확한 해결방안을 찾지 못해서 다음에 찾게 되면 글로 작성해보는 시간을 가져보겠습니다.
(=> 당시 업데이트가 아직 되지 않아 오류가 났던거라 지금은 신경쓰지 않으셔도 됩니다.)
이제 마지막 Module 단위의 build.gradle도 변경할 시간입니다.

Shift + F6 을 눌러 변경!! 그리고 sync now!

sync now 하시면 역시나 이렇게 오류가 막 생깁니다.
차근차근 변경해줍니다.
먼저 맨 위에
plugins
변경 전 )
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}
변경 후)
plugins {
id ("com.android.application")
id ("org.jetbrains.kotlin.android")
}
android
변경 전 )
android {
compileSdk 32
defaultConfig {
applicationId "com.devyoung.myapp"
minSdk 26
targetSdk 32
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
변경 후 )
android {
compileSdk = 32
defaultConfig {
applicationId = "com.devyoung.myapp"
minSdk = 26
targetSdk = 32
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
}
dependencies
변경 전 )_ empty activity로 해서 dependency가 많이 없습니다. 그 점 참고해주세요!
dependencies {
implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.google.android.material:material:1.6.0'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}
dependencies {
implementation ("androidx.core:core-ktx:1.7.0")
implementation ("androidx.appcompat:appcompat:1.4.1")
implementation ("com.google.android.material:material:1.6.0")
testImplementation ("junit:junit:4.13.2")
androidTestImplementation ("androidx.test.ext:junit:1.1.3")
androidTestImplementation ("androidx.test.espresso:espresso-core:3.4.0")
}
그리고 역시 sync now 하면 성공적으로 finish 하는 걸 보실 수 있습니다.
하지만 여기서 끝이 아닙니다!!!
이제 buildSrc를 열고 아까 main을 들어가 java or kotlin 파일에 몇 개의 파일을 만들어
좀 더 효율적으로 여러 gradle을 관리하는 방법을 알아보겠습니다.
제가 공부하던 noteapp을 예제로 가져왔습니다.
아래 사진을 보시면 data , domain module 이 있습니다. 또 gradle 파일이 app, data , domain 등 다양하게 있습니다.

이럴 때 한 번에 관리하기 쉽게 아래처럼 AppConfig 와 Dependencies 를 구별하여 만들어줍니다. ( 무조건 이렇게 한다거나 , 모두가 그런 것은 아닙니다!!! )

AppConfig에 compile sdk나 최소 midsdk 등을 적어주고 관리합니다.

Dependencies.kt 안에 또 이런식으로 적어서 dependecy를 관리할 수 있습니다.

이제 위에 Dependencies와 AppConfig를 가지고 아래와 같이 변경하여 줍니다.
android
변경 전 ) app build.gradle.kts에 android 영역 코드를 변경합니다.
android {
compileSdk 32
defaultConfig {
applicationId "com.devyoung.myapp"
minSdk 26
targetSdk 32
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
이런식으로 작성을 할 수 있습니다.
android {
compileSdk = AppConfig.complieSdk
defaultConfig {
applicationId = "com.devyoung.noteapp2"
minSdk = AppConfig.minSdk
targetSdk = AppConfig.targetSdk
versionCode = AppConfig.versionCode
versionName = AppConfig.versionName
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary = true
}
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"
)
}
}
buildFeatures {
compose = true
}
composeOptions {
kotlinCompilerExtensionVersion = "1.2.0-beta01"
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
packagingOptions {
resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
}
}
}
dependencies 도 이렇게 변경했던걸 다시

아래처럼 변경할 수 있습니다.

이런식으로 작성할 수 있습니다.
이상 kotlin migration을 알아봤습니다.
아직 글솜씨가 부족하고 저도 완벽하진 않아 많은 도움이 될 수 있을지 모르겠지만 꼭 도움이 되었으면 좋겠습니다.
읽어주셔서 감사합니다!!
'android' 카테고리의 다른 글
어노테이션 뜻, 이유, 장점 (2) | 2022.09.25 |
---|---|
안드로이드 OS 구조 (1) | 2022.09.23 |
gradle kotlin dsl migration - 1.BuildSrc 폴더 생성하고 그 안에 build.gradle.kts 생성 (0) | 2022.04.27 |
android fragment lifecycle adapter 위치 정리 (0) | 2022.04.25 |
android Unit test는 왜 작성할까? (0) | 2022.04.12 |