Compose Stability Analyzer - Рентген для вашего Jetpack Compose кода

29 May, 2026

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

Превью 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, и какие параметры стабильны или нестабильны в рамках определенной иерархии пакетов. Это особенно удобно для общего обзора проекта и поиска "горячих" зон.

Stability Explorer

Кастомизация и конфигурация

Плагин позволяет настроить цвета индикаторов под вашу тему 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: Сравнивает текущую стабильность с этим "снимком" (базовой линией).

Как это работает на практике?

  1. Создаем базовую линию: Запускаем ./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)
    
  2. Проверяем изменения: При каждом изменении кода, например, в 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)!