Все статьи

Краткий экскурс в мультиплатформу на Kotlin

Мобильное приложение13 февраля 2026

На данный момент есть уже достаточно много способов написать приложение сразу для нескольких платформ: от вебовских фреймворков на Electron и инструментов React Native и до Flutter. Но в последнее время специалисты JetBrains тоже не стояли на месте и представли для языка Kotlin много классных нововедений: Kotlin 2.0 и K2, мультиплатформа и поддержка Compose для нее. О них и поговорим. 

1) Kotlin Multiplatform(KMP) - инструмент выноса общего кода для нескольких платформ, для изменения кода для различными платформами используются разные компиляторы, такие как Kotlin-JVM, Kotlin-JS и Kotlin-Native. Они содержат специфичные для каждой платформы версии, инструменты и библиотеки языка.
Рассмотрим пример с Android/iOs/Desktop, если код компилируется под Android то под капотом он компилируется в Java байткод для того чтобы JVM конкретной платформы ее выполнил, для приложения на пк ситуация похожая. А вот с iOS такой фокус не сработает, JVM не поддерживается. Для того чтобы это работало код компилируется в нативный Kotlin код, который уже на платформе будет преобразован в код понятный ios.

Теперь в компиляторе Kotlin есть фронтенд, который преобразует код в промежуточное представление (intermediate representation - IR), а бэкенд конвертирует это промежуточное представление в машинный код.

Так, в случае android он преобразует его в байткод java, а в случае iOS - в нативный машинный код iOS.

Преимущества Kotlin Multiplatform:

  1. Kotin и Java. Доступно много фишек языка и большая кодовая база решений как на kotlin, и еще больше на java
  2. Переиспользование кода. Можно выносить общий код в отдельные компоненты и переиспользовать их по необходимости, нет нужды писать одну и ту же логику для разных платформ
  3. Скорость разработки по сравнению с написанием нескольких приложении для разных платформ.

Недостатки Kotlin Multiplatform:

  1. Больший обьем ответственности и компетенции от разработчика, так как нужно прослеживать разное поведение на разных платформах, для ios разработчика необходимы знания jvm

2) Compose Multiplatform - инструмент для написания общего ui как для всех платформ, так и для каждой платформы в частности

Для быстрого создания проекта можно использовать инструмент - https://terrakok.github.io/Compose-Multiplatform-Wizard/

После создания видим что проект разбивается на несколько модулей:

  • composeApp - модуль приложения, в нем описан относящийся к созданию приложения код, например описание иконки и activity для android приложения или создания окна для desktop приложения
  • server - модуль приложения отвечающий за сервер, создается по необходимости или как часть wasm приложения
  • shared - общая или специфичная для платформы логика или ui

Внутри данных модулей содержатся несколько платформенных пакетов, которые собираются уже по необходимости на целевой платформе с помощью JVM

  • commonMain – код, который можно объединить полностью. Например чистая логика без какого-либо обращения к нативу;
  • iosMain – код, который будет специфичен для iOS;
  • androidMain – код, который будет специфичен для Android;
  • desktopMain/jvmMain - код, специфичный для десктопного приложения;
  • wasmJsMain - код, специфичный для веб приложения на основе kotlin web assembly

Код внутри модулей по необходимости можно разбивать на дополнительные подмодули в зависимости от предпочтении или формата работы команды, например разбитие на фича модули или ui фреймворк будет довольно удобно для работы с большим проектом сразу нескольких разработчиков.

Как это использовать? Специально для этого была введена пара ключевых слов expect/actual, ожидаемое и актуальная имлементация, например:
В директорий shared/commonMain создаем файл с необходимым нам функционалом

Далее например, в пакете shared/androidMain переопределяем наше объявленное значение:

Теперь при использовании на платформе Android будет использовано значение для конкретной платформы, но при этом данные переопределения нужно объявить для всех доступных платформ.

В следующем разделе рассмотрим как это использовать для нескольких модулей и как правильно организовать Clean Architecture для такого проекта.

0