Перейти к содержанию

Обзор Kotlin Multiplatform

Kotlin Multiplatform (KMP) позволяет компилировать общий Kotlin-код для нескольких объявленных targets. Один и тот же исходный код отдельно компилируется для каждого target в подходящий формат, например JVM-байткод, JavaScript или нативный бинарный файл. Единой универсальной среды выполнения здесь нет. Например, Android-приложение использует модуль как Kotlin/JVM-код, а iOS-приложение может вызывать Kotlin/Native-фреймворк из Swift. Исходный код общий, но итоговые бинарные файлы и границы взаимодействия различаются.

commonMain содержит код для всех targets multiplatform-модуля. В нём доступны общие Kotlin API и multiplatform-библиотеки, но нельзя напрямую вызывать API, которого нет хотя бы на одном target. Например, Android framework или JDK-only API недоступны в общем коде модуля, который также собирается для iOS. Платформенные интеграции размещают за интерфейсами, объявлениями expect/actual или в более узких платформенных source sets. Выбирай самую простую границу, которая не пропускает платформенные API в общий код.

Что можно переиспользовать

KMP не задаёт обязательный процент общего кода или архитектуру приложения. Общими могут быть:

  • отдельные библиотеки, модели, валидация и алгоритмы;
  • networking, сериализация, хранение данных, repositories и синхронизация;
  • бизнес-правила, use cases и presentation state;
  • отдельные UI-компоненты или целые экраны Compose Multiplatform.

Общий UI необязателен. Jetpack Compose на Android и SwiftUI на iOS могут использовать одну общую логику, а другой продукт может переиспользовать и Compose UI. Термины разобраны в статье KMP, KMM и Compose Multiplatform.

Категории платформ

KMP поддерживает несколько семейств платформ, но их tooling и зрелость экосистемы различаются:

  • Android и другие JVM targets;
  • iOS и другие Apple targets через Kotlin/Native;
  • desktop- и server-side приложения на JVM;
  • JavaScript и Wasm для web;
  • native targets, включая Linux и Windows.

Для Windows есть два разных подхода. JVM desktop-приложение может работать в Windows и использовать Compose Multiplatform Desktop. Windows Native target, например mingwX64, создаёт нативный код и имеет другие API, зависимости и tooling. Поддержка target в Kotlin также не означает такой же уровень стабильности Compose Multiplatform UI на этом target.

Осознанный выбор KMP

KMP особенно полезен, когда платформы разделяют существенную часть поведения, а команда готова владеть и общим кодом, и нативной интеграцией. Граница может проходить после небольшого core или охватывать data, domain, presentation и UI. Выбор должен зависеть от требований продукта, совместимости библиотек, lifecycle и стоимости interoperability, а не от максимального процента общего кода.

Далее: Структура проекта и Source Sets, Общий и платформенный код и Внедрение KMP и компромиссы.

Источники