Краткий экскурс в мультиплатформу на Kotlin
На данный момент есть уже достаточно много способов написать приложение сразу для нескольких платформ: от вебовских фреймворков на 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:
- Kotin и Java. Доступно много фишек языка и большая кодовая база решений как на kotlin, и еще больше на java
- Переиспользование кода. Можно выносить общий код в отдельные компоненты и переиспользовать их по необходимости, нет нужды писать одну и ту же логику для разных платформ
- Скорость разработки по сравнению с написанием нескольких приложении для разных платформ.
Недостатки Kotlin Multiplatform:
- Больший обьем ответственности и компетенции от разработчика, так как нужно прослеживать разное поведение на разных платформах, для 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 для такого проекта.







