KMP против Flutter, React Native и нативной разработки
Итоговая карта выбора: где KMP сильнее альтернатив, а где уступает.
Кросс-платформенный спектр — от полностью нативной разработки (ничего не делится) до Flutter (делится почти всё, включая UI); KMP занимает гибкую позицию между ними.
Что делится и какой UI
| Подход | Язык | Делится | UI |
| Натив | Kotlin + Swift | ничего | нативный, дважды |
| KMP (классика) | Kotlin | логика | нативный, дважды |
| KMP + Compose MP | Kotlin | логика + UI | общий (Skia) |
| Flutter | Dart | логика + UI | общий (Skia) |
| React Native | JS/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» — его суть.