org.jetbrains.kotlin.backend.common.BackendException: Backend Internal error: Exception during IR lowering
File being compiled: /Users/yijihun/AndroidStudioProjects/KakaoMediaSearch/core/ui/src/main/java/com/kenshi/ui/components/LoadingWheel.kt
The root cause java.lang.RuntimeException was thrown at: org.jetbrains.kotlin.backend.jvm.codegen.FunctionCodegen.generate(FunctionCodegen.kt:47)
새로운 모듈을 생성하여 해당 모듈에 Composable 함수를 생성하고, 해당 함수의 preview 를 확인하기 위해 preview code 를 작성한 뒤에 동작 시켜보았는데 다음과 같은 에러가 발생하였다.
package com.kenshi.ui.components
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.size
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
@Composable
fun LoadingWheel() {
Box(modifier = Modifier.fillMaxSize()) {
CircularProgressIndicator(
modifier = Modifier
.align(Alignment.Center)
.size(30.dp)
)
}
}
@Preview
@Composable
fun LoadingWheelPreview() {
LoadingWheel()
}
stackOverflow 에 검색 결과들을 확인해보았으나, 만족스러운 답변을 찾지 못하여, 고민을 하였는데
원인은 다음과 같았다.
buildFeatures {
compose = true
}
해당 모듈에 compose를 활성화 시켜주지 않았던 것이었다..!
새로운 모듈을 생성했을 경우 다른 라이브러리 의존성은 다 추가했어도 compose 를 활성화 해주지 않으면 저런 Backend internal error 가 뜬다는 것을 알게되었다.
고치고 나서 보면 굉장히 기초적인 에러인것 같지만, 처음 보는 에러로 당황하시는 분들 위해 정리 해보았다.
우선, Kotlin Backend 라는 것은 Kotlin 컴파일러의 Backend 를 의미하며, Kotlin 컴파일러의 구조를 간단하게 살펴보면 다음과 같다.
IR은 Kotlin 컴파일러의 내부에서 사용되는 중간 표현 형식이다.
이렇게 Kotlin 컴파일러는 크게 Front-end, Back-end 2단계를 거쳐, 최종 실행 가능한 코드를 생성하게 된다.
Front-end: 코드 자체는 문법적으로 틀린 부분이 없음 (@Composable 등의 구문 분석 가능), IR 생성 시도
Back-end: Compose 관련 IR을 JVM 바이트코드로 변환하려 할 때 실패
즉, 컴파일러가 코드를 읽고 이해하는 것(Front-end)까지는 성공
하지만 실제로 실행 가능한 바이트코드를 생성하는 단계(Back-end)에서 실패 했음을 의미한다.
buildFeatures {
compose = true
}
위 코드를 통해 Compose 컴파일러 플러그인을 활성화해야, Kotlin 컴파일러는 Compose 관련 코드를 올바르게 처리할 수 있다.
하지만 Compose 컴파일러 플러그인이 활성화되어 있지 않기 때문에, Kotlin 컴파일러는 @Composable 을 실행 가능한 코드 변환할 방법을 알 수 없는 것이다.
아직 학습하고 있는 내용이기 때문에, 하단의 레퍼런스들의 글을 읽어보면 좋을 듯하다.
레퍼런스)
https://ducorner.tistory.com/8
https://akuleshov7.com/2021-06-24-kotlin-representation.html
에러 발생 이유 추가 보충 예정