Запрос «что такое kmp» чаще всего приводит к двум разным ответам: это либо Kotlin Multiplatform — технология кроссплатформенной разработки от JetBrains, либо алгоритм Кнута — Морриса — Пратта для поиска подстроки в строке. Оба значения относятся к программированию, но решают совершенно разные задачи, и путать их нельзя.
В этой статье разберём оба значения аббревиатуры, но основной фокус — на Kotlin Multiplatform, поскольку именно эта технология чаще всего подразумевается в контексте разработки приложений для Android, iOS, десктопа и веба. Вы узнаете, как устроен KMP, чем он отличается от Flutter и React Native, и в каких случаях его внедрение оправдано.
Что такое Kotlin Multiplatform (KMP)
Kotlin Multiplatform — это технология от компании JetBrains, позволяющая писать общий код на языке Kotlin и использовать его сразу на нескольких платформах: Android, iOS, desktop (Windows, macOS, Linux), веб и серверной части. Ключевая идея — не «написать один раз, запустить везде», а переиспользовать бизнес-логику, оставляя нативный UI на каждой платформе.
Это принципиальное отличие от классических кроссплатформенных фреймворков. KMP не навязывает собственный движок отрисовки интерфейса: экраны можно делать нативно — через Jetpack Compose на Android и SwiftUI на iOS, а общей оставить только логику: сетевые запросы, работу с базой данных, валидацию, модели данных.
Общий код компилируется в платформенные форматы: для Android — в JVM-байткод, для iOS — в нативный фреймворк через Kotlin/Native, для веба — в JavaScript или WebAssembly. Таким образом, производительность общей части близка к нативной.
Как устроена архитектура KMP-проекта
Проект на KMP делится на так называемые source sets — наборы исходного кода. Есть общий модуль commonMain, где лежит платформенно-независимая логика, и платформенные модули: androidMain, iosMain и другие. В них размещается код, специфичный для конкретной системы.
Когда в общем коде нужен доступ к платформенной возможности (например, к файловой системе или настройкам), используется механизм expect/actual: в общем модуле объявляется ожидание (expect), а в каждом платформенном — его реализация (actual).
// commonMainexpect fun getPlatformName(): String
// androidMain
actual fun getPlatformName(): String = "Android"
Такой подход позволяет гибко дозировать долю общего кода: в одних проектах это только сетевой слой, в других — почти всё приложение, включая ViewModel и навигацию.
📊 Использовали ли вы Kotlin Multiplatform в реальных проектах?