Что такое Kotlin Multiplatform и когда он оправдан
Основы3 минРедакция Innovialabs
Коротко
Kotlin Multiplatform (KMP) позволяет написать бизнес-логику, работу с сетью и данными один раз на Kotlin и использовать ее в iOS и Android, оставив интерфейс нативным. Он оправдан, когда важны нативный UX и уже есть Android-экспертиза.
Что такое Kotlin Multiplatform
Kotlin Multiplatform (KMP) — технология от JetBrains, которая позволяет писать общий код на Kotlin и компилировать его под разные платформы: Android, iOS, десктоп, веб и сервер.
Главная идея: делить то, что не зависит от платформы, и оставлять нативным то, что от нее зависит. Обычно общими становятся:
- бизнес-логика и правила;
- работа с API и сетью;
- модели данных, валидация, кэш и локальная база;
- аналитика и обработка ошибок.
Интерфейс при этом можно оставить нативным: Jetpack Compose на Android и SwiftUI на iOS. Для iOS общий код компилируется в обычный нативный фреймворк, который подключается в Xcode как любая другая зависимость.
Как это устроено
Проект делится на source sets: commonMain для общего кода и androidMain, iosMain для платформенного. Когда нужно что-то платформенное, используется механизм expect/actual: в общем коде объявляется ожидание, а каждая платформа дает реализацию.
// commonMain
expect fun platformName(): String
// androidMain
actual fun platformName(): String = "Android"
// iosMain
actual fun platformName(): String = "iOS"
Вокруг KMP сложилась экосистема библиотек: Ktor для сети, kotlinx.serialization для JSON, kotlinx.coroutines для асинхронности, SQLDelight и Room для баз данных.
Compose Multiplatform
Compose Multiplatform — следующий шаг: общий не только код логики, но и UI. Это фреймворк JetBrains на основе Jetpack Compose, который рисует интерфейс на Android, iOS, десктопе и в вебе.
Получается выбор из двух режимов:
- Только логика общая, UI нативный. Максимальное соответствие платформам, но интерфейс пишется дважды.
- Логика и UI общие через Compose Multiplatform. Меньше кода, но на iOS интерфейс не будет полностью «яблочным» без дополнительной работы.
Режимы можно смешивать: часть экранов на Compose, часть на SwiftUI.
Зрелость технологии
Kotlin Multiplatform объявлен стабильным, Google официально поддерживает его для общей логики между Android и iOS, а Compose Multiplatform для iOS также получил стабильный статус. Многие крупные компании используют KMP в продакшене.
При этом стоит учитывать:
- экосистема библиотек меньше, чем у Flutter и React Native;
- iOS-разработчикам нужно привыкнуть к Kotlin-коду и инструментам сборки Gradle;
- скорость сборки под iOS и отладка общего кода из Xcode требуют настройки.
Чем отличается от Flutter и React Native
| Критерий | Kotlin Multiplatform | Flutter | React Native |
|---|---|---|---|
| Язык | Kotlin | Dart | JavaScript / TypeScript |
| Что общее | Логика, по желанию UI | Логика и UI | Логика и UI |
| UI | Нативный или Compose | Собственный движок отрисовки | Нативные компоненты через JS |
| Внедрение | Можно постепенно в существующее приложение | Обычно новое приложение | Можно по экранам, но сложнее |
| Порог входа | Низкий для Android-команды | Нужно учить Dart | Низкий для веб-команды |
Ключевое отличие: KMP не заставляет менять UI-подход. Его можно внедрять постепенно, начиная с одного модуля, например с сетевого слоя.
Когда KMP оправдан
- У вас уже есть нативные приложения, и логика в них расходится.
- В команде сильная Android-экспертиза.
- Важны нативный UX и производительность, но не хочется дублировать бизнес-логику.
- Сложная логика: финансы, офлайн-синхронизация, расчеты, где ошибки из-за двух реализаций дорого обходятся.
Когда лучше другой вариант
- Нужен быстрый MVP силами небольшой команды без Kotlin-опыта — Flutter или React Native могут дать результат быстрее.
- Команда сильна в вебе и TypeScript — React Native ближе.
- Приложение простое, и общей логики почти нет.