Kotlin 2.0 으로 마이그레이션(KSP, proto dataStore)

Jetpack Compose, Kotlin DSL, version catalog 를 사용하는 안드로이드 프로젝트에서 Kotlin 2.0 으로 업그레이드하는 과정과 그 후에 KSP, proto dataStore 와 관련하여 겪었던 문제를 기술한다.

새 앱 모듈 추가 후에 오류 발생

org.gradle.api.plugins.UnknownPluginException: Plugin [id: 'org.jetbrains.kotlin.plugin.compose', version: '1.9.10', apply: false] was not found in any of the following sources

Plugin Repositories (could not resolve plugin artifact 'org.jetbrains.kotlin.plugin.compose:org.jetbrains.kotlin.plugin.compose.gradle.plugin:1.9.10')

며칠 전에 기존 앱을 복사해서 앱 모듈을 생성했을 때는 문제가 없었는데, 오늘 처음부터 새로 앱 모듈을생성하니까 gradle sync 과정에서 저런 오류가 발생했다. 며칠 사이에 변화가 있었나 보다.

찾아보니까 코틀린 2.0 으로 올려야 한단다.

Kotlin 2.0 으로 업그레이드

https://android-developers.googleblog.com/2024/04/jetpack-compose-compiler-moving-to-kotlin-repository.html
이 내용을 참고해서 version catalog 를 고쳤다. 버전, 라이브러리, 플러그인 이름 등 변수명은 사람마다 다르게 정의할 수 있다(version catalog 의 단점. 나는 version catalog 로 전환할 때 now in android 앱의 설정을 많이 참고했다. 변수명을 한 번 정했으면 그냥 쭉 가는 게 낫다). 다음은 내 정의에 맞게 고친 것이다.

[versions]
kotlin = "2.0.21"
ksp = "2.0.21-1.0.28"

[plugins]
kotlin = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }

// Add the Compose Compiler Gradle plugin, the version matches the Kotlin plugin
kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }

KSP 와 Kotlin 의 버전은 다음 링크를 참고했다. 현시점 최신 안정 버전을 선택했다. 둘이 버전이 안 맞으면 오류가 생긴다:
https://github.com/google/ksp/releases

그 다음에 root level build.gradle.kts 파일에 다음을 추가하였다:

plugins {
// Existing plugins
alias(libs.plugins.kotlin.compose) apply false
}

compose 를 사용하는 앱 module level build.gradle.kts 파일에 다음을 추가하였다:

plugins {
// Existing plugins
alias(libs.plugins.kotlin.compose)
}

같은 파일에서, kotlinCompilerExtensionVersion 변수는 이제 필요없다고 한다. 전에는 이렇게 Kotlin 버전과 Compose 버전을 일부러 맞춰줘야 했는데 이제 그러지 않아도 된단다:

//    composeOptions {
// //kotlinCompilerExtensionVersion = "1.5.8" //for Kotlin 1.9.22
// kotlinCompilerExtensionVersion = "1.5.3" //for Kotlin 1.9.10
// //kotlinCompilerExtensionVersion = "1.4.8" //for Kotlin 1.8.22
// }

같은 파일에서, 필요하면 다음을 넣으라고 하는데 나는 아직 넣지 않았다. 나중에 무슨 문제 생기면 고려해보겠다:

android { ... }

composeCompiler {
enableStrongSkippingMode = true
}

KSP 가 DataStore 를 처리하지 못함

그 후에 Sync 는 잘 됐는데, 컴파일 오류가 발생했다:

e: [ksp] InjectProcessingStep was unable to process 'MemorizeViewModel(androidx.datastore.core.DataStore<error.NonExistentClass>, -중략-)' because 'error.NonExistentClass' could not be resolved.

전에도 이런 비슷한 오류를 겪었었다. 그때는 고육책으로 코틀린 버전을 낮춰서 문제를 비켜갔는데 이제 그 방법은 안 통한다. https://hhtt.kr/103049

검색한 결과 다음의 내용을 찾았다.
https://stackoverflow.com/questions/78634960/ksp-error-when-upgrading-android-project-to-compose-compiler-2-0-0

아래 내용을 module level build.gradle.kts 맨 끝에 추가하였다:

androidComponents {
onVariants(selector().all()) { variant ->
afterEvaluate {
val capName = variant.name.capitalized()
tasks.getByName<KotlinCompile>("ksp${capName}Kotlin") {
setSource(tasks.getByName("generate${capName}Proto").outputs)
}
}
}
}

그 후에 앱이 잘 컴파일되었다.

Leave a Comment