Android/Jetpack Compose

[Android] Compose Sample Project에서 겪은 Version 문제 해결 방법과 순서

Heeg's 2023. 10. 25. 23:23
728x90

오랜만에 블로그 글을 작성하기 앞서, 기존에 작성했던 프로젝트들을 한번 둘러보았다.

둘러보던 도중, Compose Sample Project가 정상적으로 Build 되지 않았고, 해당 문제는 다양한 Version이 낮아 발생하는 이슈로 빌드가 되지 않았다.

 

따라서, 해당 프로젝트가 정상적으로 빌드되기까지 진행했던 작업들에 대해 기록해두고자 한다.

 

Compose의 버전을 올림으로서 발생하는 Compose syntax Error를 제외하고, 일반적으로 IDE 환경에서 발생할 수 있는 이슈들이라고 생각이 되었고,

필자와 마찬가지로 낮은 버전에서 버전을 올릴 경우 최소 아래 기술한 내용들을 모두 체크하고 작업해야 하므로 이후 작업에도 도움이 될 것이라고 판단하였다.


Sample Project를 가져와서 다시 빌드를 해 보았을 때 가장 처음 만났떤 이슈는 다음과 같다.

 

e: java.lang.IllegalAccessError: class org.jetbrains.kotlin.kapt3.base.KaptContext (in unnamed module @0x48cfedf4) cannot access class com.sun.tools.javac.util.Context (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.util to unnamed module @0x48cfedf4

 

알 수 없는 hashCode 값과 함께 오류가 발생하였다.

해당 이슈는 사용중인 Kotlin Version이 JDK 버전과 호환이 되지 않아 발생하는 문제다.

 

따라서, Kotlin 버전을 올려주도록 하였다.

 

id 'org.jetbrains.kotlin.android' version '1.7.10' apply false

 

 

해당 프로젝트를 작성할 때 낮은 버전을 사용하고 있었는지 기억은 명확히 나진 않지만 Kotlin Version으로 1.5.21을 사용하고 있었는데, 적당한 버전인 1.7.10 버전으로 올렸다.

 

그 이후 빌드를 다시 해보면 다음과 같은 오류가 발생한다.

 

Caused by: org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:JDK Version Issue.

 

말 그대로 JDK Version이 맞지 않다는 것이다.

 

Mac OS 기준으로 Android Studio > Preferences > Build, Execution, Deployment > Build Tools > Gradle에 들어가서 사용하는 JDK Version을 변경해 준다.

 

 

JDK Version은 16+ 버전이면 정상동작 하므로 최소 16 이상의 버전을 사용해주어야 한다.

 

Kotlin, JDK Version을 맞췄다고 해서 바로 빌드 성공은 되지 않겠지만, 오류 체크를 위해 다시 빌드를 한번 해보자.

 

e: This version (1.0.1) of the Compose Compiler requires Kotlin version 1.5.21 but you appear to be using Kotlin version 1.7.10 which is not known to be compatible. Please fix your configuration (or `suppressKotlinVersionCompatibilityCheck` but don't say I didn't warn you!).

 

Compose Version이 맞지 않는다고 한다.

내용을 읽어보니 왜 Kotlin Version을 1.5.21으로 설정했는지 알 것 같다. 

Compose 1.0.1 Version을 사용하기에 최소 Version이었던 것으로 보인다.

 

buildscript {
    ext {
        compose_version = '1.3.1'
    }
}

 

따라서, 1.0.1 버전을 사용하고 있던 Compose의 버전을 적당히 1.3.1로 올린다.

 

Caused by: org.gradle.workers.internal.DefaultWorkerExecutor$WorkExecutionException: A failure occurred while executing com.android.build.gradle.internal.tasks.CheckAarMetadataWorkAction

 

당연히 빌드를 하면 다음과 같은 에러가 나오고, 에러 스택을 쭉 읽어보면 다음과 같은 메시지를 볼 수 있다.

 

Dependency 'androidx.compose.ui:ui-tooling:1.3.1' requires libraries and applications that depend on it to compile against version 33 or later of the Android APIs.

 

1.3.1 버전을 사용하려면 Compile Version이 33 이상이어야 한다.

Gradle에 들어가서 확인을 해보니 아니나 다를까, 32 버전을 사용하고 있다.

 

android {
    compileSdk 33

    defaultConfig {
        applicationId "com.example.composesample"
        minSdk 23
        targetSdk 33
        versionCode 1
        versionName "1.0"
        ...
    }
    ...
}

 

Compile, target Sdk Version을 33으로 올리도록 한다.

Target은 왜 올리는가 싶겠지만, Android SDK Upgrade Assistant를 보면 다음과 같이 나와있다.

 

Starting August 31, 2023, all apps (except for Wear OS) must target Android 13 (API level 33) or higher in order to be submitted to Google Play for review and remain discoverable by all Google Play users.

 

33 버전을 타겟 해야 한다고 하니까 33으로 올린다.

해당 프로젝트에는 상관없는 내용이지만, 일단 맞춰둔 것이지 크게 상관은 없다.

 

해당 설정을 한 후에도 당연하다시피 빌드는 되지 않는다.

 

Minimum supported Gradle version is 7.4. Current version is 7.2.

 

SDK Version을 올렸더니 이번에는 Gradle Version 이 맞지 않기 때문이다.

Gradle 버전을 올리기 위해 Project 단위의 Gradle 파일과 gradle-wrapper-properties 파일을 수정해 주도록 한다.

 

build.gradle

plugins {
    id 'com.android.application' version '7.3.0' apply false
    id 'com.android.library' version '7.3.0' apply false
    ...
}

 

gradle-wrapper.properties

distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip

 

properties에서 gradle 버전을 올려주지 않으면 build.gradle에서 버전을 바꾸어도 정상적으로 적용되지 않는다.

 

그 이후 별 다른 문제 없이 빌드가 안 되는 경우가 발생할 수 있는데, 당연히 이 때는 IDE의 Caches를 지우고 다시 시작하면 된다.

 

 

자, 이 작업까지 끝났다면 이제 별 이슈 없이 빌드가 되어야 정상이다.

하지만, 필자가 작성해 둔 프로젝트에는 Room을 사용하는 부분이 있었고, 그 때문에 Rxjava2를 사용하는 부분이 존재했다.

 

따라서,

 

To use RxJava2 features, you must add `rxjava2` artifact from Room as a dependency. androidx.room:room-rxjava2:<version>

error: Type of the parameter must be a class annotated with @Entity or a collection/array of it.
    kotlin.coroutines.Continuation<? super kotlin.Unit> continuation);

 

다음과 같은 에러가 발생한다.

해당 에러를 보고 처음 들었던 생각은, Rxjava2 버전 문제인가? 싶었지만,

어림도 없다. RxJava2 version이 아닌 Room version을 올려주면 된다.

 

필자가 사용하던 Room의 버전은 2.4.2 버전이었는데, 2.4.3 버전으로만 올려주면 된다.


위의 많은 작업을 끝내고 나서 빌드를 해보니 정상적으로 잘 동작을 하였다.

 

 

아.. 뭔가 대충 Compose를 사용하여 이것저것 넣어뒀던 것들이 생각났다.

이 샘플 프로젝트를 기반으로 다시 이것 저것 작업을 해서 넣을 생각이었는데, 구조를 보니 깜깜하다.

 

Compose 관련하여 글을 처음 작성한 지 거의 1년 반의 시간이 지났는데, 정말 많은 부분이 변경된 것 같다.

1년에 가까운 시간 동안 Compose를 실무에 적용시켜 보면서 겪었던 이슈들, 다양한 팁 같은 것들을 생각이 나는 대로, 시간이 되는대로 글을 하나씩 작성해보고자 한다.

 

우선, Compose 버전을 1.3.1 이 아닌 1.4.1 버전으로 올리고 시작할 것 같지만

이번 글은 여기서 마치고자 한다.

 

728x90