Автор: Android-разработчик с 7+ годами опыта, знающий толк в FrameLayout, merge, include, RecyclerView, а теперь и Modifier.padding.
Введение
Если вы стоите перед выбором: продолжать с XML или начать писать UI на Jetpack Compose, — значит, вы уже на полпути к новому уровню. Но этот выбор должен быть осознанным. Compose — это не всегда «давай всё перепишем». Это шаг в сторону новой архитектурной модели. А значит, нужно задать себе несколько правильных вопросов.
Вопросы, которые стоит задать себе (и команде)
1. Проект новый или уже живой?
✅ Новый проект: Compose — логичный выбор. Нет смысла тащить наследие.
⚠ Живой проект: возможно, стоит идти через Gradual Migration (например, экраны по одному).
2. Какой уровень знаний команды?
Если команда на «ты» с Kotlin, Coroutines, StateFlow — Compose зайдёт быстро.
Если всё ещё в парадигме MVP и LiveData — будет больно, но полезно.
3. Как устроен текущий UI-фреймворк?
Используется DataBinding? ViewBinding? MVVM?
Есть ли сложные кастомные View или анимации?
4. Требуется ли WebView, MapView, ExoPlayer?
Эти штуки пока требуют танцев в Compose, либо использовать AndroidView.
Под капотом: что важно знать, прежде чем делать выбор
Размер библиотек
XML (ViewSystem):
Лёгкая на старте, всё уже встроено.
Не тянет ничего сверху.
Jetpack Compose:
Библиотеки по модулям (foundation, material, ui-tooling и т.д.).
В среднем добавляют от 1 до 4 МБ в зависимости от используемых компонентов.
Kotlin Compiler Plugin и Compose Compiler тоже увеличивают сборку.
⚠ Если size-critical приложене, стоит быть осторожным с preview, tooling, animation
Размеры основных библиотек Jetpack Compose (release-сборка)
Библиотека | Примерный размер в APK (minified) |
---|---|
androidx.compose.ui:ui | ~420 KB |
androidx.compose.foundation:foundation | ~700 KB |
androidx.compose.material:material | ~1.3 MB |
androidx.compose.runtime:runtime | ~380 KB |
androidx.compose.compiler:compiler | ⚠️ не входит в APK — это плагин |
androidx.compose.material3:material3 | ~1.7 MB |
androidx.compose.animation:animation | ~600 KB |
androidx.compose.ui:ui-tooling | ~1.2 MB (только debug) |
androidx.activity:activity-compose | ~120 KB |
androidx.navigation:navigation-compose | ~240 KB |
Если ты используешь Material 3, она весит больше, чем Material 2, за счёт более сложной темизации, адаптивных компонентов и анимаций.
Tooling и Preview — включаются только в debug, и не попадают в release.
В среднем, минимальный рабочий Compose стек (без Material, без Navigation) добавляет примерно 2–3 МБ к финальному .apk.
Полноценный стек с material3, animation, navigation, foundation, и пр. — до 5–6 МБ в зависимости от Proguard и R8 оптимизации.
Как работает рендеринг
XML
LayoutInflater → создаёт дерево View-объектов.
MeasureSpec + onMeasure/onLayout/onDraw.
Всё связано с ViewRootImpl, Choreographer, Handler.
Compose
Компайлится в SlotTable — структура, хранящая UI как функции.
Recomposer отслеживает состояние, вызывает только изменённые Composables.
LayoutNode → RenderNode → Skia → Canvas.
Нет View, нет LayoutInflater, нет findViewById.
📌 State меняется → recomposition → только часть UI обновляется → минимальный overdraw.
Жизненный цикл
XML → завязан на Activity/Fragment lifecycle напрямую.
Compose → использует remember, DisposableEffect, LaunchedEffect, SideEffect, и Composition Lifecycle.
Это значит, что ваши UI-компоненты сами управляют собой. Они знают, когда их уничтожили, и могут отменить подписки, запустить анимации и прочее — внутри себя.
Критические отличия, которые не видны сразу
Параметр | View System (XML) | Jetpack Compose |
Инкапсуляция UI | Через custom View | Через Composable-функции |
Тестирование UI | Espresso, Robolectric | Compose Test API (JUnit) |
Навигация | Fragment + NavComponent | Compose Navigation (или вручную) |
Превью в IDE | XML Layout Editor | Compose Preview |
Динамический UI | Через if/else + View.GONE | Просто if (condition) {} |
Когда точно стоит брать Compose
Создаёте дизайн с большим количеством состояний.
Хотите избавиться от Adapter и ViewHolder.
Мечтаете про анимации без боли.
Пишите Kotlin и не хотите прыгать между XML и кодом.
Что почитать глубже
Заключение
Выбор между XML и Compose — это не просто про удобство. Это про то, насколько вы готовы отпустить старый способ мышления и довериться системе. Compose требует доверия, но как только вы его дадите — он удивит вас скоростью, гибкостью и контролем.
В следующей части мы поговорим про архитектуру и подходы к построению сложных UI в Compose — как проектировать масштабируемые компоненты, управлять состоянием и организовывать навигацию без боли.