#android #kotlin #android-jetpack-compose
Вопрос:
У меня есть большой проект, и я решил добавить в него композицию jetpack. Сначала я подготовил отдельный проект с некоторыми @Composable
компонентами, и все работало. Затем, после добавления источников и подготовительных зависимостей в мой проект во время компиляции, я начал получать эту ошибку:
org.jetbrains.kotlin.backend.common.BackendException: Backend Internal error: Exception during IR lowering
File being compiled: C:/Users/.../CatalogScreen.kt
The root cause java.lang.RuntimeException was thrown at: org.jetbrains.kotlin.backend.jvm.codegen.FunctionCodegen.generate(FunctionCodegen.kt:50)
at org.jetbrains.kotlin.backend.common.CodegenUtil.reportBackendException(CodegenUtil.kt:239)
at org.jetbrains.kotlin.backend.common.CodegenUtil.reportBackendException$default(CodegenUtil.kt:235)
at org.jetbrains.kotlin.backend.common.phaser.PerformByIrFilePhase.invokeSequential(performByIrFile.kt:68)
at org.jetbrains.kotlin.backend.common.phaser.PerformByIrFilePhase.invoke(performByIrFile.kt:55)
at org.jetbrains.kotlin.backend.common.phaser.PerformByIrFilePhase.invoke(performByIrFile.kt:41)
...
Caused by: java.lang.RuntimeException: Exception while generating code for:
FUN name:CatalogScreen visibility:public modality:FINAL <> () returnType:kotlin.Unit
annotations:
Composable
BLOCK_BODY
VAR PROPERTY_DELEGATE name:currentTab$delegate type:androidx.compose.runtime.MutableState<kotlin.Int> [val]
CALL 'public final fun remember <T> (calculation: @[DisallowComposableCalls] kotlin.Function0<T of androidx.compose.runtime.ComposablesKt.remember>): T of androidx.compose.runtime.ComposablesKt.remember [inline] declared in androidx.compose.runtime.ComposablesKt' type=androidx.compose.runtime.MutableState<kotlin.Int> origin=null
<T>: androidx.compose.runtime.MutableState<kotlin.Int>
calculation: BLOCK type=kotlin.Function0<androidx.compose.runtime.MutableState<kotlin.Int>> origin=LAMBDA
COMPOSITE type=kotlin.Unit origin=null
FUNCTION_REFERENCE 'private final fun CatalogScreen$lambda-0 (): androidx.compose.runtime.MutableState<kotlin.Int> declared in ...CatalogScreenKt' type=kotlin.Function0<androidx.compose.runtime.MutableState<kotlin.Int>> origin=LAMBDA reflectionTarget=null
at org.jetbrains.kotlin.backend.jvm.codegen.FunctionCodegen.generate(FunctionCodegen.kt:50)
at org.jetbrains.kotlin.backend.jvm.codegen.FunctionCodegen.generate$default(FunctionCodegen.kt:43)
at org.jetbrains.kotlin.backend.jvm.codegen.ClassCodegen.generateMethodNode(ClassCodegen.kt:349)
...
Caused by: org.jetbrains.kotlin.codegen.CompilationException: Back-end (JVM) Internal error: Couldn't inline method call 'remember' into
@androidx.compose.runtime.Composable public fun CatalogScreen(): kotlin.Unit defined in ...catalog
<no source>
Cause: Not generated
File is unknown
The root cause java.lang.IllegalStateException was thrown at: org.jetbrains.kotlin.codegen.inline.InlineCodegen$Companion.getCompiledMethodNodeInner(InlineCodegen.kt:578)
at org.jetbrains.kotlin.codegen.inline.InlineCodegen.throwCompilationException(InlineCodegen.kt:101)
at org.jetbrains.kotlin.codegen.inline.InlineCodegen.performInline(InlineCodegen.kt:141)
at org.jetbrains.kotlin.backend.jvm.codegen.IrInlineCodegen.genInlineCall(IrInlineCodegen.kt:148)
at org.jetbrains.kotlin.backend.jvm.codegen.IrInlineCallGenerator$DefaultImpls.genCall(IrInlineCallGenerator.kt:29)
...
Caused by: java.lang.IllegalStateException: Couldn't obtain compiled function body for IrBasedSimpleFunctionDescriptor: FUN IR_EXTERNAL_DECLARATION_STUB name:remember visibility:public modality:FINAL <T> (calculation:@[DisallowComposableCalls] kotlin.Function0<T of androidx.compose.runtime.ComposablesKt.remember>) returnType:T of androidx.compose.runtime.ComposablesKt.remember [inline]
at org.jetbrains.kotlin.codegen.inline.InlineCodegen$Companion.getCompiledMethodNodeInner(InlineCodegen.kt:578)
at org.jetbrains.kotlin.codegen.inline.InlineCodegen$Companion.access$getCompiledMethodNodeInner(InlineCodegen.kt:542)
at org.jetbrains.kotlin.codegen.inline.InlineCodegen.createInlineMethodNode$backend(InlineCodegen.kt:535)
at org.jetbrains.kotlin.codegen.inline.InlineCodegen.performInline(InlineCodegen.kt:134)
... 70 more
Мой простой код выглядит так:
@Composable
fun CatalogScreen() {
var currentTab by remember { mutableStateOf(0) }
}
В своем проекте я использую compose 1.0.1
, kotlin 1.5.21
, gradle 7.1.1
и множество плагинов и библиотек, включая сопрограммы и сериализацию kotlinx, однако уродливое удаление каждой зависимости не делает код работающим.
Может быть, кто-то сталкивался с такого рода ошибкой и знает, что может к ней привести или что может ее нарушить?
Комментарии:
1. Если это начало происходить после добавления зависимостей в рабочий проект, обнаружьте это с помощью двоичного поиска, например, сначала половину комментариев и т. Д. когда вы обнаружили проблему, сообщите об этом в службу отслеживания проблем или в службу поддержки конкретных зависимостей, или и то, и другое
2. Мне трудно сказать, связано ли это с этапом компиляции или с конфигурацией сборки. Я не уверен, почему мое решение работает, но… оно все еще работает 🙂
Ответ №1:
Решение было очень хитрым:
В моем buildSrc
buildGradle у меня был следующий код:
repositories {
google()
jcenter()
maven(url = "https://storage.googleapis.com/r8-releases/raw")
}
plugins {
`kotlin-dsl`
}
dependencies {
implementation("com.android.tools.build:gradle:7.0.0")
}
Добавление api(kotlin("gradle-plugin:1.5.21"))
в зависимости решало проблемы сборки.
Я оставляю эту подсказку для других разработчиков, которые повлияют на эту проблему.
Комментарии:
1. Это также устранило мою проблему. Но я не уверен, почему. Я менял материал в buildSrc, но зачем мне нужна зависимость в файле сборки buildSrc, чтобы она работала в отдельных модулях?
Ответ №2:
Возможно, вам также не хватает этого в файле build.gradle вашего модуля
buildFeatures { // Enables Jetpack Compose for this module
compose = true
}
composeOptions {
kotlinCompilerVersion versions.kotlin
kotlinCompilerExtensionVersion versions.composeCompiler
}
Ответ №3:
Я слышал, что всякий раз, когда возникает «внутренняя ошибка внутреннего компилятора», она исходит от самого компилятора и должна быть сообщена. Попробуйте создать новый проект из шаблонов Студии и посмотрите, компилируется ли он. Если это так, то просто скопируйте и вставьте свой код в этот.
Спасибо!
Комментарии:
1. и, конечно же, в прикрепленном вами фрагменте нет ошибки, при условии, что правильные зависимости и импорт уже есть в вашем проекте, как вы тоже упомянули в своем первоначальном вопросе.
2. Спасибо за ваше предложение, решение было простым, но очень трудным для изобретения. Я не знаю, связано ли это с компилятором или, скорее, с конфигурацией сборки
3. Эй, пожалуйста, посмотри, твое ли это дело. developer.android.com/jetpack/compose/gestures#nested-scrolling
4. Вместо того, чтобы явно добавлять зависимость, как в файле сборки, просто проверьте
settings.gradle
и измените версию там. Похоже, это ошибка в канарейке Шмеля 6