org.jetbrains.kotlin.backend.common.BackendException: Backend Internal error: Exception during IR lowering

이지훈·2023년 4월 28일
0

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 Exception 라는 에러가 발생한 이유

우선, Kotlin Backend 라는 것은 Kotlin 컴파일러의 Backend 를 의미하며, Kotlin 컴파일러의 구조를 간단하게 살펴보면 다음과 같다.

  1. Front-end
    • 소스코드 파싱, 구문 분석, 문법 검사
    • IR(Intermediate Representation) 생성

IR은 Kotlin 컴파일러의 내부에서 사용되는 중간 표현 형식이다.

  1. Back-end
    • IR을 타겟 플랫폼(JVM, Native, JavaScript)에 맞는 코드로 변환
      - JVM 타겟의 경우: IR -> JVM 바이트코드
      - Native 타겟의 경우: IR -> LLVM IR -> 기계어
      - JS 타겟의 경우: IR -> JavaScript 코드

이렇게 Kotlin 컴파일러는 크게 Front-end, Back-end 2단계를 거쳐, 최종 실행 가능한 코드를 생성하게 된다.

Backend 단계에서 에러가 발생한 이유

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

profile
실력은 고통의 총합이다. Android Developer

1개의 댓글

comment-user-thumbnail
2024년 11월 9일

에러 발생 이유 추가 보충 예정

답글 달기