Jetpack Compose выполняет код в несколько этапов, поэтому некоторые части функции @Composable выполняются отдельно друг от друга. Сбои на этих этапах могут приводить к появлению трассировок стека, которые сложно расшифровать, поэтому трудно определить, какая именно функция или строка кода вызвала сбой.
Как добавить информацию об источнике в трассировки стека
Чтобы улучшить читаемость трассировки стека, API с возможностью включения предоставляет более подробную информацию о местоположении сбоя, в том числе названия и местоположения composable-функций. Это позволяет:
- Эффективно выявлять и устранять причины сбоев.
- Как изолировать сбои для воспроизводимых примеров
- Исследуйте сбои, которые ранее показывали только внутренние кадры стека.
Во время выполнения Compose может обнаружить место сбоя в композиции и восстановить трассировку стека на основе иерархии @Composable. Трассировка стека добавляется при сбоях в:
- Композиция
DisposableEffectиLaunchedEffect(кромеonDisposeили отмены)- Сопрограммы запущены в
rememberCoroutineScope - Этапы измерения, макета и отрисовки
Чтобы включить эту функцию, добавьте следующие строки в точку входа приложения:
// Enable stack traces at application level: onCreate class SampleStackTracesEnabledApp : Application() { override fun onCreate() { super.onCreate() // Enable Compose stack traces for minified builds only. Composer.setDiagnosticStackTraceMode(ComposeStackTraceMode.Auto) // Alternatively: // Enable verbose Compose stack traces for local debugging Composer.setDiagnosticStackTraceMode(ComposeStackTraceMode.SourceInformation) } }
Рекомендуем выполнить эту настройку до создания композиций, чтобы убедиться, что информация о трассировке стека собирается правильно.
Для параметра ComposeStackTraceMode доступны четыре варианта:
Auto– рекомендуемый вариант, поскольку в нем используетсяGroupKeys, если приложение минимизировано, иNoneв противном случае.GroupKeys: трассировки стека создаются для приложений, код которых был минимизирован. Информация о ключе группы сохраняется даже после минификации и используется вместе с файлом сопоставления ProGuard, созданным компилятором Compose и R8, чтобы восстановить приблизительное местоположение функций@Composable. Эти трассировки стека менее точны и оптимизированы, чтобы избежать дополнительной работы во время выполнения. Компилятор Compose поддерживает создание дополнительных сопоставлений R8, начиная с Kotlin 2.3.0.SourceInformation: полезно для неминимизированных сборок, собирает информацию об источнике и добавляет ее в трассировку стека. Результаты будут более точными, но это значительно повлияет на производительность, как и при подключении инспектора макета. Они создаются для использования в отладочных версиях приложений, чтобы получать точные данные о сбоях, для которых требуется больше информации о местоположении. Информация об источнике удаляется из минимизированных приложений, чтобы оптимизировать размер и производительность двоичных файлов.None: дополнительные сведения о трассировке стека не добавлены.
При использовании параметра SourceInformation трассировка стека будет отображаться как DiagnosticComposeException в списке подавленных исключений:
java.lang.IllegalStateException: Test layout error
at <original trace>
Suppressed: androidx.compose.runtime.DiagnosticComposeException:
Composition stack when thrown:
at ReusableComposeNode(Composables.kt:<unknown line>)
at Layout(Layout.kt:79)
at <lambda>(TempErrorsTest.kt:164)
at <lambda>(BoxWithConstraints.kt:66)
at ReusableContentHost(Composables.kt:164)
at <lambda>(SubcomposeLayout.kt:514)
at SubcomposeLayout(SubcomposeLayout.kt:114)
at SubcomposeLayout(SubcomposeLayout.kt:80)
at BoxWithConstraints(BoxWithConstraints.kt:64)
at SubcomposeLayoutErrorComposable(TempErrorsTest.kt:164)
at <lambda>(TempErrorsTest.kt:86)
at Content(ComposeView.android.kt:430)
at <lambda>(ComposeView.android.kt:249)
at CompositionLocalProvider(CompositionLocal.kt:364)
at ProvideCommonCompositionLocals(CompositionLocals.kt:193)
at <lambda>(AndroidCompositionLocals.android.kt:113)
at CompositionLocalProvider(CompositionLocal.kt:364)
at ProvideAndroidCompositionLocals(AndroidCompositionLocals.android.kt:102)
at <lambda>(Wrapper.android.kt:141)
at CompositionLocalProvider(CompositionLocal.kt:384)
at <lambda>(Wrapper.android.kt:140)
Известные ограничения
Есть несколько известных проблем с фреймами трассировки стека:
Трассировки стека исходной информации
Отсутствуют номера строк (<unknown line>) в первом стековом фрейме для сбоев в композиции. Поскольку проверка исходной информации выполняется после сбоя, данные таблицы слотов могут быть неполными, а номер строки может быть пропущен.
ReusableComposeNode и remember не создают информацию об источнике, поэтому в кадрах стека для этих функций будет указано <unknown line>.
Трассировки стека групповых ключей
GroupKeys-трассировки стека по умолчанию могут указывать только на первую строку функции @Composable. Кроме того, они не содержат данных для функций, которые не создают группы (например, встроенных функций или функций, не возвращающих единицы).
Сбои при сборе трассировки стека
Если сбор трассировки стека завершится со сбоем по какой-либо причине, это исключение будет добавлено как подавленное исключение вместо DiagnosticComposeException.
Сообщайте о подавленных сбоях и несоответствиях трассировки стека в компонент Compose Runtime.