Kotlin Multiplatform Mobile — что это такое, ключевые понятия и архитектура KMM

Автор: IT Sectr Опубликовано: 2026-05-02 Время чтения: 9 мин

Kotlin Multiplatform Mobile (KMM) — это технология от JetBrains для использования общего кода на Kotlin в приложениях под iOS и Android с сохранением нативных UI на каждой платформе. В отличие от гибридных фреймворков, KMM не использует WebView и не рендерит интерфейс через абстракции — бизнес-логика пишется один раз, а пользовательский интерфейс остаётся полностью нативным. По данным JetBrains, 2025, KMM используют более 40 тысяч команд по всему миру. expect/actual — ключевой механизм Kotlin, позволяющий объявлять платформенно-зависимые API в общем коде.

Главное

  • KMM — технология JetBrains для шаринга бизнес-логики между iOS и Android на Kotlin
  • expect/actual — механизм объявления платформенных API в общем модуле с реализацией под каждую ОС
  • Нативный UI — интерфейс пишется отдельно на SwiftUI и Jetpack Compose, без WebView
  • Shared модуль — содержит модели данных, сетевые запросы, валидацию и бизнес-правила
  • Ktor и Kotlinx — библиотеки JetBrains для сетевого взаимодействия и сериализации в общем коде

Что такое Kotlin Multiplatform Mobile?

Kotlin Multiplatform Mobile (KMM) — это технология, которая позволяет писать общую бизнес-логику мобильного приложения на Kotlin и использовать её на iOS и Android без дублирования кода. В отличие от Ionic или Cordova, KMM не рендерит интерфейс в WebView — UI остаётся полностью нативным и пишется на SwiftUI (iOS) и Jetpack Compose (Android).

KMM был анонсирован JetBrains в 2019 году как часть стратегии Kotlin Multiplatform. Ключевое отличие от других кроссплатформенных решений — фреймворк не пытается унифицировать UI, а фокусируется на шаринге именно того кода, который действительно одинаков для обеих платформ: сетевые запросы, модели данных, валидация форм, бизнес-правила и работа с базами данных.

По данным JetBrains Developer Survey (2025), KMM используют 14% мобильных разработчиков, и этот показатель растёт на 5% ежегодно. Технологию выбирают компании с высокими требованиями к производительности и нативному пользовательскому опыту, для которых гибридные решения неприемлемы.

Архитектура KMM: shared модуль и платформенные реализации

Архитектура KMM состоит из трёх модулей: shared (общий код на Kotlin), iosApp (нативное iOS-приложение на Swift) и androidApp (нативное Android-приложение на Kotlin). Shared модуль компилируется в JAR для Android и в универсальный фреймворк (Apple Framework) для iOS.

Shared модуль: что выносится в общий код

В shared модуль попадают все слои, не зависящие от платформы: сетевой слой на Ktor Client, модели данных с сериализацией через kotlinx.serialization, репозитории для управления данными, валидация форм и бизнес-правила (например, расчёт стоимости доставки или проверка прав доступа).

Shared модуль использует Gradle Multiplatform Plugin и содержит три набора исходников: commonMain (общий код), androidMain (Android-специфичные реализации) и iosMain (iOS-специфичные реализации). Компилятор Kotlin/Native превращает общий код в нативную библиотеку для iOS, которая подключается к Swift-проекту через XCFramework.

Платформенные модули

Android-модуль — это стандартное Android-приложение на Kotlin с Jetpack Compose или ViewBinding. Shared модуль подключается как обычная Gradle-зависимость, и все классы из commonMain доступны напрямую.

iOS-модуль — это Xcode-проект на Swift или Objective-C. Shared модуль подключается через CocoaPods, Swift Package Manager или XCFramework. Kotlin/Native генерирует Objective-C заголовки для экспорта Kotlin-типов, делая их доступными из Swift.

Механизм expect/actual в KMM

expect/actual — это механизм Kotlin Multiplatform, который позволяет объявить API в общем коде (expect declaration) и предоставить его реализацию отдельно для каждой платформы (actual declaration). Компилятор следит, чтобы actual существовал для каждой целевой платформы.

Типичные сценарии использования expect/actual: получение текущего времени с учётом часового пояса, работа с SharedPreferences (Android) / UserDefaults (iOS), криптографические функции и генерация UUID. На каждой платформе используется собственный системный API.

Без expect/actual было бы невозможно иметь единый код бизнес-логики, так как API для работы с файловой системой, сетью и хранилищем различаются между iOS и Android на уровне системных вызовов. Механизм гарантирует, что разработчик не забудет реализовать платформенную часть.

Для платформенных вызовов, таких как работа с камерой или биометрией, KMM предлагает библиотеку expect/actual в сочетании с плагинами, аналогичными Cordova, но на Kotlin/Native. JetBrains также выпустила библиотеку kotlinx-datetime, абстрагирующую работу с датами.

Примеры кода на KMM

Рассмотрим базовую структуру KMM-проекта с объявлением expect-функции для генерации UUID и её реализацией под iOS и Android.

kotlin
// commonMain — общее объявление
expect fun generateUUID(): String

// androidMain — реализация под Android
actual fun generateUUID(): String {
    return java.util.UUID.randomUUID().toString()
}

// iosMain — реализация под iOS
actual fun generateUUID(): String {
    return platform.Foundation.NSUUID().UUIDString
}

В общем коде объявляется expect fun generateUUID(). Для Android используется java.util.UUID, для iOS — NSUUID из Foundation framework. В остальном коде shared модуля эта функция вызывается без учёта платформы.

Пример сетевого запроса с использованием Ktor Client в общем коде:

kotlin
import io.ktor.client.*
import io.ktor.client.request.*
import io.ktor.client.statement.*
import kotlinx.serialization.*
import kotlinx.serialization.json.*

@Serializable
data class User(
    val id: Int,
    val name: String
)

class UserRepository {
    private val client = HttpClient()

    suspend fun getUser(id: Int): User {
        val response: HttpStatement =
            client.get("https://api.example.com/users/$id")
        return Json.decodeFromString(response.bodyAsText())
    }
}

Этот код работает на обеих платформах без изменений. Ktor Client использует OkHttp под Android и NSURLSession под iOS автоматически, без дополнительной конфигурации. Сериализация JSON через kotlinx.serialization также кросс-платформенна.

Сравнение KMM с Flutter и React Native

KMM занимает уникальную позицию среди кроссплатформенных технологий, так как не пытается заменить нативный UI в отличие от Flutter и React Native. KMM — это решение для шаринга логики, а не для унификации интерфейса.

КритерийKMMFlutterReact Native
UIНативный (SwiftUI / Jetpack Compose)Собственный движок (Skia)JavaScript → нативные компоненты
ЯзыкKotlin (shared) + Swift / Kotlin (UI)DartJavaScript / TypeScript
ПроизводительностьМаксимальная (нативный UI)Высокая (собственный рендеринг)Средняя (мост JS-Native)
Шаринг кодаБизнес-логика (40–70%)UI + логика (80–95%)UI + логика (70–90%)
Порог входаВысокий (два языка)Средний (один язык)Низкий (веб-разработчики)

Основное преимущество KMM — полный контроль над UI. Если приложение должно выглядеть и вести себя как нативное на каждой платформе (например, использовать iOS TabBar и Android BottomNavigation с платформенными анимациями), KMM — единственное кроссплатформенное решение, обеспечивающее это без костылей.

Недостаток — команда должна владеть Kotlin, Swift, Jetpack Compose и SwiftUI одновременно, что усложняет найм. Flutter и React Native требуют знания одного языка и одного фреймворка.

Преимущества и сложности внедрения KMM

Kotlin Multiplatform Mobile — мощная технология, но её внедрение требует взвешенного подхода. Рассмотрим ключевые преимущества и типичные сложности, с которыми сталкиваются команды.

Преимущества KMM

Первое и главное преимущество — сокращение дублирования кода. По данным JetBrains Case Studies (2024), команды, внедрившие KMM, сокращают объём дублируемого кода на 60–80% для сетевого слоя и на 40–50% для бизнес-логики в целом. Это напрямую влияет на скорость разработки и количество багов.

Второе преимущество — производительность на уровне нативных приложений. В отличие от гибридных фреймворков, KMM не добавляет слоёв абстракции между UI и системой. Код бизнес-логики выполняется так же быстро, как если бы он был написан на Swift или Kotlin для каждой платформы отдельно.

Сложности внедрения

Основная сложность — квалификация команды. Разработчики должны знать Kotlin (для shared модуля), а также Swift и Jetpack Compose (для UI). Найти универсального специалиста сложно, поэтому обычно формируется команда из Android и iOS разработчиков, которые совместно ведут shared модуль.

Вторая сложность — инструментарий. KMM требует настройки Gradle, CocoaPods или Swift Package Manager, а также интеграции с Xcode. На ранних этапах проекта часты проблемы с конфигурацией сборки, особенно при работе с C-библиотеками.

Третья сложность — отладка. Когда баг возникает на стыке Kotlin/Native и Swift, определить его причину сложнее, чем в монолитном приложении. JetBrains постоянно улучшает инструменты отладки, но на практике командам приходится тратить до 20% времени на инфраструктурные задачи.

Часто задаваемые вопросы

Можно ли использовать KMM для iOS без Android?

Да, KMM поддерживает iOS как единственную целевую платформу. Shared модуль компилируется в iOS-фреймворк, который подключается к Swift-проекту через XCFramework. Android-модуль можно не создавать. Это полезно для команд, которые хотят использовать Kotlin для бизнес-логики iOS-приложения.

Чем KMM отличается от Kotlin/Native?

Kotlin/Native — это компилятор, который транслирует Kotlin-код в нативный бинарник без виртуальной машины. KMM использует Kotlin/Native для компиляции shared модуля под iOS. Для Android KMM использует стандартный Kotlin/JVM компилятор. Kotlin/Native — технологический фундамент KMM.

Как KMM работает с базами данных?

Для работы с локальными базами данных в KMM используется SQLDelight — кроссплатформенная библиотека, генерирующая Kotlin-код из SQL-запросов. Под Android она работает через Android SQLite API, под iOS через Native SQLite (CFNetwork). Альтернатива — Realm Kotlin SDK от MongoDB.

Поддерживает ли KMM UI-компоненты?

KMM не включает UI-компоненты по умолчанию — UI пишется на SwiftUI и Jetpack Compose отдельно. Однако существуют библиотеки, такие как Compose Multiplatform (от JetBrains), которые позволяют рендерить UI на Kotlin сразу под iOS и Android без нативных фреймворков.

Какие компании используют KMM в продакшне?

KMM используют крупные компании: Netflix (шаринг логики рекомендаций), McDonald's (мобильное приложение), VMWare (корпоративные приложения) и Leroy Merlin (приложение для стройматериалов). Список растёт, так как JetBrains активно инвестирует в развитие экосистемы.

Итоги

  • KMM — технология JetBrains для шаринга бизнес-логики между iOS и Android на Kotlin с нативным UI
  • Архитектура включает shared модуль и платформенные реализации через expect/actual
  • Shared модуль содержит сетевое взаимодействие (Ktor), модели (kotlinx.serialization) и бизнес-правила
  • expect/actual — ключевой механизм для платформенно-зависимых реализаций в общем коде
  • Производительность на уровне нативных приложений, так как UI не использует абстракции
  • Сложности включают высокие требования к квалификации команды и настройку инфраструктуры сборки
  • Выбор KMM оправдан для проектов, где критичен нативный UX и высокий процент шаринга логики

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также