2022. 5. 24. 21:46ㆍandroid
1편에 이어 두 번째 시간입니다.
여기서는 기존의 Gradle 파일을 바꾸는 작업을 하겠습니다.
groovy에서 kotlin으로 변경할 때는 몇 가지 규칙이 있습니다.
https://developer.android.com/studio/build/migrate-to-kts?hl=ko
규칙의 내용은 공식 홈페이지에서 확인이 가능합니다.
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 |