Compose Stability Analyzer - Рентген для вашего Jetpack Compose кода
Знакомая ситуация: ваш Jetpack Compose проект начинает подтормаживать, а UI перерисовывается чаще, чем хотелось бы? Вы вроде бы всё делаете по гайдам, но где-то закралась ошибка, и найти её вручную — задача не из легких. Привет, друзья-разработчики! Сегодня мы погрузимся в мир оптимизации Jetpack Compose и рассмотрим инструмент, который станет вашим незаменимым помощником в борьбе с избыточными рекомпозициями – Compose Stability Analyzer.

Что это за зверь и зачем он нужен?
Compose Stability Analyzer — это не просто библиотека, а целый комплекс инструментов, разработанный специально для анализа стабильности ваших Composable-функций в Jetpack Compose. По сути, это ваш личный рентген, который позволяет заглянуть внутрь компонентов и понять, почему они ведут себя так, а не иначе. Он дает ответы на критически важные вопросы:
- Почему этот Composable перерисовывается, хотя данные, казалось бы, не изменились?
- Какие параметры делают мою функцию нестабильной?
- Как отследить избыточные рекомпозиции прямо во время работы приложения?
- Как гарантировать, что никто случайно не сломает стабильность в будущем?
Проект состоит из двух основных частей: плагина для Android Studio/IntelliJ IDEA и Gradle-плагина. Вместе они дают мощный арсенал для диагностики и профилактики проблем производительности в Compose-приложениях. Если вы пишете на Compose и заботитесь о производительности, этот инструмент определенно стоит вашего внимания.
Мгновенная обратная связь: Плагин для IDE
Представьте себе светофор, который загорается прямо в вашем редакторе кода, показывая, какие Composable-функции стабильны (зеленый), а какие — нет (красный). Именно это делает плагин Compose Stability Analyzer для Android Studio и IntelliJ IDEA. Он предоставляет визуальную обратную связь в реальном времени, помогая выявлять и исправлять проблемы производительности прямо во время написания кода.
1. Иконки в области отступа (Gutter Icons)
Самый быстрый способ оценить стабильность. Цветные точки на полях редактора мгновенно показывают, является ли Composable пропускаемым (skippable) или нет. Если видите красные точки, значит, пора присмотреться к этим функциям.

При наведении курсора на имя Composable-функции появляется подробная всплывающая подсказка. Она расскажет не только о том, является ли функция skippable или restartable, но и покажет, сколько параметров стабильны, а сколько — нет, и самое главное — какие именно параметры вызывают нестабильность. Это дает вам не просто факт, а причину.
2. Встроенные подсказки параметров (Inline Parameter Hints)
Еще более детальный уровень обратной связи. Маленькие значки рядом с типами параметров показывают статус стабильности каждого отдельного параметра. Вы видите информацию о стабильности для каждого параметра с первого взгляда. Это особенно полезно в сложных функциях с множеством входных данных.

3. Инспекции кода (Code Inspections)
Плагин не просто показывает проблемы, он активно предлагает решения! Когда у вас есть нестабильный Composable, инспекции могут:
- Подсветить проблему предупреждающей линией.
- Предложить быстрые исправления через меню Alt+Enter.
- Добавить аннотацию
@TraceRecompositionдля отладки рекомпозиций. - Предоставить опции подавления, если нестабильность намеренна.
Это как иметь автоматизированного ревьюера кода, который следит за производительностью Compose.
4. Stability Explorer
Этот инструмент предоставляет отдельное окно в IDE, позволяющее визуально отслеживать, какие Composable-функции являются skippable или non-skippable, и какие параметры стабильны или нестабильны в рамках определенной иерархии пакетов. Это особенно удобно для общего обзора проекта и поиска "горячих" зон.

Кастомизация и конфигурация
Плагин позволяет настроить цвета индикаторов под вашу тему IDE, включить режим Strong Skipping для более глубокого анализа, а также определить файл конфигурации стабильности. В этом файле вы можете вручную пометить собственные типы как стабильные, даже если они не имеют аннотаций @Stable или @Immutable. Это очень полезно для сторонних библиотек или сгенерированного кода.


Глубже в детали: Gradle-плагин для трассировки и валидации
Помимо плагина для IDE, Compose Stability Analyzer предлагает мощный Gradle-плагин, который расширяет возможности анализа до уровня сборки и выполнения приложения. Это позволяет не только отлаживать, но и предотвращать проблемы стабильности на ранних этапах.
1. Трассировка рекомпозиций в рантайме с @TraceRecomposition
Представьте, что у вас есть "детектор движения" для ваших Composable-функций. Аннотация @TraceRecomposition делает именно это! Просто добавьте её к любой Composable-функции, и Gradle-плагин автоматически сгенерирует код для логирования изменений параметров при каждой рекомпозиции. Больше не нужно писать Log.d() вручную!
@TraceRecomposition
@Composable
fun UserProfile(user: User) {
Column {
Text("Name: ${user.name}")
Text("Age: ${user.age}")
}
}
Пример логов:
D/Recomposition: [Recomposition #1] UserProfile
D/Recomposition: └─ user: User stable (User@abc123)
D/Recomposition: [Recomposition #2] UserProfile
D/Recomposition: └─ user: User changed (User@abc123 → User@def456)
Это невероятно полезно для:
- Отладки производительности: Выявление Composable, которые перерисовываются слишком часто и почему.
- Мониторинга: Установка порога (
threshold) для отслеживания избыточных рекомпозиций и отправки событий в аналитику (например, Firebase). - Понимания поведения Compose: Наглядное изучение того, как изменения состояния вызывают рекомпозиции.
Кстати, можно задать threshold, чтобы логировались только те рекомпозиции, которые превышают определенное количество, и tag для удобной фильтрации в Logcat. И, конечно, вы можете полностью переопределить логирование, предоставив свой RecompositionLogger.

2. Валидация стабильности в CI/CD: "Тесты на стабильность"
Вы потратили недели на оптимизацию, сделали все Composable стабильными, а потом кто-то из команды случайно меняет val на var в дата-классе, и вот уже десятки Composable становятся нестабильными. Знакомый сценарий? Stability Validation — это ваша страховка от таких ситуаций.
Эта функция работает через две Gradle-задачи:
stabilityDump: Создает "снимок" стабильности всех Composable-функций в вашем модуле в файле.stability.stabilityCheck: Сравнивает текущую стабильность с этим "снимком" (базовой линией).
Как это работает на практике?
-
Создаем базовую линию: Запускаем
./gradlew :app:stabilityDump. Это создает файлapp/stability/app.stability, который содержит полную информацию о стабильности всех ваших Composable. Обязательно коммитим этот файл в Git! Он становится вашим "контрактом стабильности".@Composable public fun com.example.UserCard(user: com.example.User): kotlin.Unit skippable: true restartable: true params: - user: STABLE (marked @Stable or @Immutable) -
Проверяем изменения: При каждом изменении кода, например, в CI/CD, запускаем
./gradlew :app:stabilityCheck. Если стабильность изменилась (например, параметр стал нестабильным), билд упадет, предотвращая регрессию! Плагин покажет, какие именно Composable-функции изменили свой статус.❌ Stability check failed! The following composables have changed stability: ~ com.example.UserCard(user): stability changed from STABLE to UNSTABLE If these changes are intentional, run './gradlew stabilityDump' to update the stability file.
Это позволяет вам либо исправить регрессию, либо, если изменение намеренное, обновить базовую линию, зафиксировав это решение в истории Git. Такая интеграция в CI/CD (например, с GitHub Actions) — это мощный инструмент для поддержания высокого качества кода и производительности в больших командах.
Практическое применение: Когда и как использовать?
- Отладка "тормозов": Если ваш Compose-интерфейс работает медленно или "лагает", плагин IDE поможет быстро локализовать проблемные Composable-функции, а
@TraceRecompositionдаст детальную картину их поведения в рантайме. - Обучение и глубокое понимание Compose: Наглядные индикаторы и логирование помогают новичкам и опытным разработчикам лучше понять внутренние механизмы рекомпозиции и стабильности в Compose.
- Поддержание производительности в команде: Интеграция
stabilityCheckв CI/CD гарантирует, что ни одно изменение не ухудшит производительность незаметно. Это особенно ценно в больших проектах с множеством разработчиков. - Рефакторинг и оптимизация: После внесения изменений, направленных на улучшение стабильности, вы можете быстро проверить, насколько они эффективны.
Выводы: Стоит ли попробовать?
Безусловно! Compose Stability Analyzer — это не просто "еще один плагин", это полноценная экосистема для работы со стабильностью Jetpack Compose. Он закрывает одну из самых сложных и неочевидных проблем в разработке на Compose — отладку избыточных рекомпозиций.
Если вы:
- Разрабатываете на Jetpack Compose.
- Заботитесь о производительности своего приложения.
- Работаете в команде и хотите поддерживать высокий стандарт качества кода.
- Или просто хотите глубже понять, как работает Compose изнутри.
Тогда этот инструмент станет вашим надежным союзником. Он экономит часы отладки, предотвращает регрессии и помогает создавать более быстрые и отзывчивые приложения. Настоятельно рекомендую добавить его в свой арсенал инструментов для Android-разработки. Попробуйте, и вы удивитесь, насколько проще станет жизнь с Compose!
Поддержите проект на GitHub, поставив звезду и следите за обновлениями автора skydoves (Jaewoong Eum)!
