KMP против Flutter, React Native и нативной разработки

Итоговая карта выбора: где KMP сильнее альтернатив, а где уступает.

Кросс-платформенный спектр — от полностью нативной разработки (ничего не делится) до Flutter (делится почти всё, включая UI); KMP занимает гибкую позицию между ними.

Что делится и какой UI

ПодходЯзыкДелитсяUI
НативKotlin + Swiftничегонативный, дважды
KMP (классика)Kotlinлогиканативный, дважды
KMP + Compose MPKotlinлогика + UIобщий (Skia)
FlutterDartлогика + UIобщий (Skia)
React NativeJS/TSлогика + UIнативные виджеты через мост

KMP против Flutter

Flutter делит всё, включая UI, но интерфейс не нативный — это пиксели на движке. KMP делит логику, оставляя UI родным (или общим через Compose MP — тогда он становится похож на Flutter). Выбор: нужен идеальный платформенный look-and-feel и постепенное внедрение — KMP; нужна максимальная скорость и единый UI с нуля — Flutter.

KMP против React Native

RN рендерит нативные виджеты, но через JS-мост, что добавляет рантайм-прослойку и точки трения (особенно на стыке JS и натива). KMP компилируется в нативный код без моста, поэтому в производительности логики выигрывает и лучше интегрируется с существующим нативным кодом. RN силён, когда команда — веб-разработчики на React.

KMP против натива

Чистый натив даёт максимум контроля и нулевые компромиссы, но платит полным дублированием логики. KMP убирает дублирование самой ценной части, почти не жертвуя нативностью UI. Для команд, у которых уже два нативных приложения, KMP — наименее рискованный способ начать делить код.

Как работает под капотом: почему позиции разные

Корень различий — что компилируется во что. KMP компилирует Kotlin в нативный код каждой платформы, поэтому интегрируется как родная зависимость и не несёт моста. Flutter везёт свой движок отрисовки и Dart-рантайм. RN держит JS-движок и мост к нативу. Отсюда — разные профили производительности, размера и «нативности». KMP уникален тем, что позволяет выбрать степень шеринга: только логика или ещё и UI.

Когда что выбирать

  • KMP: есть нативные приложения, важен родной UI, хотите делить логику без риска.
  • KMP + Compose MP: хотите делить и UI, оставаясь в экосистеме Kotlin.
  • Flutter: новый проект, скорость и единый UI важнее идеальной нативности.
  • React Native: команда сильна в React/JS.
  • Натив: предельные требования к платформе, ресурсов на две команды хватает.

Частые ошибки

Сравнивать KMP и Flutter как «одно и то же» — у них разные оси шеринга. Вторая ошибка — выбирать KMP ради «общего UI» (это про Compose MP, а не классический KMP). Третья — недооценивать постепенность KMP: его главный козырь против Flutter/RN — внедрение в готовый натив.

Итоги

  • KMP делит логику (и опционально UI через Compose MP), оставляя возможность нативного UI.
  • Против Flutter — нативный UI и постепенное внедрение; против RN — нет JS-моста.
  • Против натива — убирает дублирование логики почти без жертв.
  • KMP уникален выбором степени шеринга: «общая логика, нативный UI» — его суть.
Проверьте себя
1. Чем KMP принципиально отличается от React Native в реализации?
AKMP использует JS-мост
BKMP компилируется в нативный код без моста, RN держит JS-движок и мост
CRN не поддерживает Android
DKMP рисует на Skia всегда
2. Когда классический KMP предпочтительнее Flutter?
AКогда нужен единый UI на своём движке
BКогда важен идеальный нативный UI и постепенное внедрение в существующие приложения
CКогда команда пишет на Dart
DКогда не нужен Kotlin
3. В чём уникальность KMP на кросс-платформенном спектре?
AОн единственный работает на iOS
BОн позволяет выбрать степень шеринга: только логика или ещё и UI (Compose MP)
CОн не требует компиляции
DОн быстрее всех всегда