Учебник Kotlin Multiplatform для начинающих
Kotlin Multiplatform (KMP) позволяет писать бизнес-логику один раз и запускать её на iOS, Android, desktop и в вебе, сохраняя при этом нативный UI на каждой платформе. Этот курс ведёт от идеи «общая логика, нативный интерфейс» через механизм expect/actual, общий и платформенный код, сеть на Ktor, сериализацию, корутины, хранение данных и внедрение зависимостей — до Compose Multiplatform, интеропа со Swift, постепенного внедрения в готовое приложение, тестирования, CI и честного сравнения с Flutter, React Native и нативной разработкой. Предполагается, что вы уже знакомы с Kotlin и Android; мы постоянно проводим параллели и не повторяем основы.
Курс «Kotlin Multiplatform: общий код для iOS и Android» состоит из 8 разделов и 26 уроков: Что такое Kotlin Multiplatform и как он устроен, Настройка проекта и сборка, Механизм expect/actual, Сеть, сериализация и асинхронность, Данные, зависимости и архитектура, UI: нативный и Compose Multiplatform, Интероп со Swift и интеграция и Тестирование, CI и зрелость экосистемы. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Что такое Kotlin Multiplatform и как он устроен
- Зачем нужен Kotlin Multiplatform
Проблема дублирования логики между iOS и Android и подход KMP: общий код бизнес-логики при нативном UI.
- Бэкенды компилятора: JVM, Native, JS, Wasm
Как один Kotlin-исходник превращается в байткод JVM, нативный бинарник iOS, JavaScript и WebAssembly.
- Анатомия KMP-проекта: source sets
commonMain, androidMain, iosMain и иерархия исходных наборов: где какой код живёт в KMP-проекте.
- Зачем нужен Kotlin Multiplatform
2 Настройка проекта и сборка
- Gradle и плагин Kotlin Multiplatform
Подключение kotlin-multiplatform плагина, объявление целей androidTarget и iOS в build.gradle.kts.
- Сборка iOS-фреймворка и подключение к Xcode
Как KMP собирает .framework/XCFramework и как iOS-приложение импортирует общий модуль в Swift.
- Общий и платформенный код в одном модуле
Как уживаются commonMain и платформенные наборы, и когда выносить логику в общий код.
- Gradle и плагин Kotlin Multiplatform
3 Механизм expect/actual
- expect и actual: объявление и реализация
Как expect-объявление в общем коде получает actual-реализации на Android и iOS.
- expect-классы, свойства и фабрики
Применение expect/actual к классам и свойствам, и почему фабричная функция часто удобнее expect-класса.
- expect/actual против интерфейсов и DI
Когда выбирать expect/actual, а когда — интерфейс с внедрением зависимостей в KMP.
- expect и actual: объявление и реализация
4 Сеть, сериализация и асинхронность
- Ktor Client: мультиплатформенный HTTP
Как Ktor Client работает на разных движках (OkHttp, Darwin) и как описать общий API-клиент в KMP.
- kotlinx.serialization: модели и JSON
Сериализация моделей в KMP без рефлексии: @Serializable, кодогенерация и работа с JSON через Json.
- Корутины в KMP и нюансы iOS
Dispatchers, structured concurrency в общем коде и особенности корутин на Kotlin/Native и iOS.
- Ktor Client: мультиплатформенный HTTP
5 Данные, зависимости и архитектура
- SQLDelight: типобезопасная БД
Как SQLDelight генерирует типобезопасный Kotlin API из SQL и работает на Android и iOS.
- multiplatform-settings для простого хранения
Лёгкое key-value хранилище в KMP поверх SharedPreferences и NSUserDefaults через единый API.
- Koin: внедрение зависимостей в KMP
Как Koin собирает граф зависимостей общего модуля и связывает платформенные реализации.
- Архитектура общего модуля и shared ViewModel
Clean Architecture в KMP, общий ViewModel со StateFlow и граница между общим кодом и нативным UI.
- SQLDelight: типобезопасная БД
6 UI: нативный и Compose Multiplatform
- Нативный UI поверх общего модуля
Как Jetpack Compose и SwiftUI подключаются к общему shared ViewModel и его состоянию.
- Compose Multiplatform: общий UI
Что такое Compose Multiplatform, как он делит UI на Android/iOS/desktop/web и его текущий статус зрелости.
- Навигация и ресурсы в общем UI
Навигация и общие ресурсы (строки, изображения) в Compose Multiplatform-проекте.
- Нативный UI поверх общего модуля
7 Интероп со Swift и интеграция
- Как Swift вызывает Kotlin
Генерация Objective-C/Swift API из Kotlin: маппинг типов, suspend-функций и Flow на стороне iOS.
- Постепенное внедрение в готовое приложение
Стратегия миграции на KMP: с какого слоя начать и как подключить общий модуль без переписывания.
- Реальный пример: общий слой данных
Сквозной пример общего слоя данных в KMP: DTO, API, репозиторий и кэш, питающие нативный UI.
- Как Swift вызывает Kotlin
8 Тестирование, CI и зрелость экосистемы
- Тестирование общего кода
Как писать общие тесты в commonTest, мокать платформенные зависимости и запускать тесты под обе платформы.
- CI, публикация и сборка под обе платформы
Нюансы CI для KMP: сборка iOS требует macOS, публикация общего модуля и кэширование Gradle.
- Ограничения и подводные камни
Честный разбор минусов KMP: отладка iOS, размер фреймворка, интероп и зрелость инструментов.
- KMP против Flutter, React Native и нативной разработки
Итоговое сравнение KMP с Flutter, React Native и нативом: что делится, какой UI и когда что выбирать.
- Тестирование общего кода