Автор: 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 — как проектировать масштабируемые компоненты, управлять состоянием и организовывать навигацию без боли.
ссылка на оригинал статьи https://habr.com/ru/articles/902252/
Добавить комментарий