🤖Улучшаем работу со Stacktrace в Jetpack Compose (особенно в релизе)
Команда Compose представила opt-in API для улучшения читаемости стектрейсов во время разработки и для релизов.
Теперь становится возможным:
👉 Точно определять источник крешей в композиции, Side Effect (LaunchedEffect, DisposableEffect) и корутинах из rememberCoroutineScope.
👉 Изолировать падения для создания воспроизводимых примеров.
👉 Изучать креши, которые раньше показывали только внутренние фреймы Compose.
Достаточно добавить одну строку в точке входа в приложение (например, в Application.onCreate()):
// Включить stack trace только для минифицированных сборок (рекомендуемый способ)
Composer.setDiagnosticStackTraceMode(ComposeStackTraceMode.Auto)
// Или для локальной отладки (более точные, но тяжёлые трассировки)
Composer.setDiagnosticStackTraceMode(ComposeStackTraceMode.SourceInformation)
‼️ВАЖНО Требуется Kotlin 2.3.0, а для режимов `Auto` и `GroupKeys` - включённый R8 с минификацией.
Есть несколько режимов работы
✔️Auto (рекомендуется): использует GroupKeys для минифицированных сборок и None для отладочных.
👉GroupKeys: для минифицированных приложений. Использует маппинг-файл от R8 для восстановления примерного местоположения.
👉SourceInformation: для отладки. Даёт точные строки где произошел креш, но затратно по производительности. Стоит использовать только на этапе разработке.
❌None: ничего не добавляет (поведение по умолчанию).
Под капотом любой креш в Compose коде оборачивается в DiagnosticComposeException, который добавляется в suppressed-исключения. В нём будет полная иерархия вызовов `@Composable` функций на момент падения!
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) <-- Ваша функция!
... и т.д.
⚠️ Известные ограничения:
👉 В режиме SourceInformation для первых фреймов могут не указываться номера строк (<unknown line>).
👉GroupKeys указывает только на первую строку @Composable функции.
👉 Если сам сбор стектрейса упадёт, его исключение будет добавлено как suppressed.
Подробнее в официальной документации
💬 А вы уже пользовались этой фичей? Делитесь в комментариях! 👇
#AndroidDev#Kotlin#Compose#R8#Android