Kotlin Multiplatform за 30 минут: быстрая настройка и первый запуск

Пошаговое практическое руководство по быстрой настройке проекта Kotlin Multiplatform (KMP) с нуля. Создание общего модуля, написание кроссплатформенной логики и ее интеграция в нативные Android и iOS приложения за минимальное время.
Kotlin Multiplatform (KMP) — это технология от JetBrains, позволяющая писать общую бизнес-логику на Kotlin и компилировать ее в нативные исполняемые файлы для JVM (Android, backend), JavaScript (браузер, Node.js) и напрямую в машинный код через Kotlin/Native (iOS, desktop). Звучит сложно, но начать можно буквально за полчаса. Это руководство проведет вас от нуля до первого работающего кроссплатформенного модуля.

Шаг 0: Предварительные требования. Убедитесь, что у вас установлены: последняя версия IntelliJ IDEA (Community или Ultimate) с плагином Kotlin, Android Studio (если планируете таргетить Android) и Xcode (если планируете таргетить iOS). Для базового примера достаточно IntelliJ IDEA.

Шаг 1: Создание проекта. Откройте IntelliJ IDEA и выберите "New Project". В левом списке найдите "Kotlin Multiplatform" (если такого нет, обновите плагин Kotlin). Выберите шаблон "Application" — он создаст проект с уже настроенными модулями для common, androidApp и iosApp. Назовите проект, например, "KMPFirstApp", и нажмите "Create". Проект будет создан и автоматически начнет синхронизацию зависимостей (это может занять пару минут). Это самый быстрый способ получить рабочую структуру.

Шаг 2: Изучение структуры проекта. После загрузки откроется проект с примерно такой структурой:
  • `shared` — это наш мультиплатформенный модуль. Внутри него лежит ключевая папка `src`. В ней:
- `commonMain/kotlin` — здесь пишется общий код, который будет работать везде.  - `androidMain/kotlin` — код, специфичный для Android (например, вызов Android SDK).
 - `iosMain/kotlin` — код, специфичный для iOS (вызов iOS API через Kotlin/Native).
 - `commonTest`, `androidTest`, `iosTest` — для тестов.
  • `androidApp` — обычный Android-модуль приложения, который зависит от `shared`.
  • `iosApp` — Xcode проект для iOS-приложения, который также зависит от `shared`.
Шаг 3: Пишем общую бизнес-логику. Откройте файл `shared/src/commonMain/kotlin/Platform.kt`. Замените его содержимое на простой, но осмысленный пример. Давайте создадим класс-валидатор для электронной почты, который будет использоваться на всех платформах.

```
class EmailValidator {
 fun isValid(email: String): Boolean {
 // Простая, но наглядная логика
 return email.isNotEmpty() && email.contains("@") && email.contains(".")
 }

 fun platformMessage(): String {
 return "Hello from KMP common code!"
 }
}
```

Этот код будет скомпилирован и для Android, и для iOS.

Шаг 4: Используем общий код в Android. Перейдите в `androidApp/src/main/java/.../MainActivity.kt` (путь может немного отличаться). Найдите функцию `onCreate`. Добавьте вызов нашего валидатора и отобразим результат в TextView.

```
import com.yourpackage.kmpfirstapp.EmailValidator // Импорт общего класса!

override fun onCreate(savedInstanceState: Bundle?) {
 super.onCreate(savedInstanceState)
 setContentView(R.layout.activity_main)

 val validator = EmailValidator()
 val email = "test@example.com"
 val isValid = validator.isValid(email)

 findViewById(R.id.text_view).text =
 "${validator.platformMessage()}\nEmail '$email' is valid: $isValid"
}
```

Убедитесь, что в макете `activity_main.xml` есть TextView с id `text_view`.

Шаг 5: Используем общий код в iOS. Это немного магия. Перейдите в `iosApp/iosApp.xcodeproj` и откройте его в Xcode (можно через двойной клик в Finder). В проекте Xcode найдите файл `ContentView.swift` (или аналогичный). Добавьте импорт общего модуля и используйте наш класс.

```
import SwiftUI
import shared // Это автоматически сгенерированный модуль KMP!

struct ContentView: View {
 let validator = EmailValidator() // Используем Kotlin-класс напрямую!
 var body: some View {
 let email = "user@ios.com"
 let isValid = validator.isValid(email: email)
 Text("\(validator.platformMessage())\nEmail '\(email)' is valid: \(isValid)")
 .padding()
 }
}
```

Обратите внимание на небольшую разницу в синтаксисе вызова: в Swift имя параметра `email:` появляется автоматически из Kotlin-функции.

Шаг 6: Запуск. Для Android: в IntelliJ IDEA или Android Studio выберите конфигурацию запуска `androidApp` и нажмите Run. Приложение запустится на эмуляторе или устройстве, показывая сообщение из общего кода и результат валидации.

Для iOS: убедитесь, что в IntelliJ IDEA выполнена сборка общего модуля для iOS (часто происходит автоматически). Затем в Xcode выберите симулятор iPhone и нажмите "Run". Приложение соберется и запустится, демонстрируя ту же логику, но уже в нативной iOS-среде.

Шаг 7 (опционально, но важно): Добавление platform-specific кода. Допустим, мы хотим получить название платформы. В общем коде (`commonMain`) объявим `expect`-объявление:

```
expect fun platformName(): String
```

Теперь в `androidMain/kotlin` создадим файл `Platform.kt` с `actual`-реализацией:

```
actual fun platformName(): String = "Android"
```

А в `iosMain/kotlin` в файле `Platform.kt`:

```
actual fun platformName(): String = "iOS"
```

Теперь в общем классе `EmailValidator` можно добавить функцию `fun getFullMessage() = "${platformMessage()} Running on ${platformName()}"`. И она будет возвращать разные строки на разных платформах, используя общий интерфейс.

Готово! За 30 минут вы создали проект Kotlin Multiplatform, написали общую бизнес-логику (валидатор) и успешно запустили ее на двух платформах. Дальнейшие шаги — углубление в механизмы ожиданий/реализаций (expect/actual), настройка библиотек (Ktor для сети, SQLDelight для БД) и организация более сложной архитектуры общего модуля. KMP открывает путь к настоящей кроссплатформенной разработке без компромиссов в производительности и нативном UX.
149 4

Комментарии (11)

avatar
t29145ow 29.03.2026
Есть вопрос: а как потом подключать нативные модули для специфичных фич на iOS и Android?
avatar
h3w7xybm7us 29.03.2026
Спасибо за четкую инструкцию. Всё сработало с первого раза, даже на Mac для iOS-сборки.
avatar
2wrfwfl 29.03.2026
Для новичка отлично, но шаг про общие expect/actual классы можно было бы раскрыть подробнее.
avatar
k6u8n9iqapun 30.03.2026
Выглядит многообещающе. Если так быстро настроить, стоит углубиться в тему для следующего проекта.
avatar
2oth2q 30.03.2026
Хороший старт, но хотелось бы больше про настройку общего модуля и работу с сетью.
avatar
wzf5g68vfheq 30.03.2026
Уже полгода пишем на KMP в продакшене. Советую сразу смотреть на Ktor для сетевого слоя.
avatar
flf33yd1 31.03.2026
Попробовал, но столкнулся с ошибкой Gradle. Пришлось искать решение отдельно, но в целом помогло.
avatar
hu19alv 31.03.2026
Интересно, а насколько это стабильно для продакшена? Есть ли подводные камни?
avatar
rku9adtpb4 31.03.2026
Отличная статья! Как раз искал, с чего начать с KMP. За 30 минут реально получилось запустить.
avatar
cwf6u97fecq 31.03.2026
После React Native хочу попробовать KMP для мобилки. Статья дала хороший первоначальный толчок.
Вы просмотрели все комментарии