Запрос «что такое 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).

// commonMain

expect fun getPlatformName(): String

// androidMain

actual fun getPlatformName(): String = "Android"

Такой подход позволяет гибко дозировать долю общего кода: в одних проектах это только сетевой слой, в других — почти всё приложение, включая ViewModel и навигацию.

📊 Использовали ли вы Kotlin Multiplatform в реальных проектах?