Kotlin Multiplatform перешёл в stable. Что это значит?
Привет! Меня зовут Максим, я руководитель мобильной разработки в KTS.
1 ноября состоялся релиз Kotlin 1.9.20, beta компилятора k2.
Но для нас интереснее глобальное изменение статуса KMP. Мы используем эту технологию в мобильной разработке и написали про неё несколько статей:
- 4 сценария, когда нужно сделать ставку на Kotlin Multiplatform, а не Flutter
- Почему так удобно использовать паттерн MVI в KMM
- KMM глазами iOS-разработчика
Что изменилось с переходом в релиз?
- Технология стабильна
- Соблюдение совместимости
- Экосистема
- База материалов по KMP
- Ускорение скорости сборки
- Развитие библиотек
- Улучшение интеропа со Swift
- Compose multiplatform
- Вывод
Технология стабильна
На самом деле, она была стабильна и на уровне беты. За почти 2 года работы мы не сталкивались с проблемами, которые заблокировали бы дальнейшее использование технологии. Статус беты означает:
- вы можете использовать эту технологию, и JB сделает все возможное, чтобы минимизировать проблемы с миграцией
- технология практически завершена, но не на 100%, поэтому возможны изменения — включая основанные на обратной связи от пользователей
Соблюдение совместимости
Основная часть KMP включает в себя компилятор, библиотеки и другие компоненты, в ней покрываются основные юзкейсы переиспользования кода. Эта часть является стабильной в версии Kotlin 1.9.20.
Но KMP имеет некоторые более сложные функции, такие как классы expect/actual. Они завершены не полностью и помечены как нестабильные. При их использовании Kotlin предупредит, что они могут измениться в будущих версиях.
Всё это означает, что основная часть KMP стабильна и безопасна для использования, но некоторые более сложные функции могут быть изменены в будущем, и вам нужно быть внимательными, если решите их использовать.
Экосистема
С релизом ввели новый визард и упростили конфигурацию.
Теперь есть новый шаблон для проектов, который автоматически настраивает части кода для разных типов проектов и уменьшает количество избыточного кода, который обычно нужен в сценариях сборки.
Для выявления и решения распространённых ошибок добавили примерно 50 диагностических сообщений в Kotlin Gradle plugin.
Теперь ошибки сборки будут отображаться более понятно и удобно в среде разработки Xcode.
В течение ближайших недель JB обещают новости о новых улучшениях тулинга.
Kotlin 1.9.0 and earlier (a standard setup)
kotlin { androidTarget() iosArm64() iosSimulatorArm64() sourceSets { val commonMain by getting val iosMain by creating { dependsOn(commonMain) } val iosArm64Main by getting { dependsOn(iosMain) } val iosSimulatorArm64Main by getting { dependsOn(iosMain) } } }
kotlin { androidTarget() iosArm64() iosSimulatorArm64() // The iosMain source set is created automatically }
База материалов по KMP
JB сам дорабатывает документацию. В ноябре они проведут несколько вебинаров для новичков, где расскажут про технологию и рассмотрят разные сценарии использования KMP.
Также JB активно поощряют пользователей на создание контента, проводят кампании по признанию заслуг сообщества и выделяют отдельных людей. Это не всё: крупные компании начинают пользоваться KMP, и доклады по технологии регулярно появляются на крупных конференциях.
Список компаний, которые уже используют KMP
Всё это популяризирует KMP и увеличивает базу материалов.
Ускорение скорости сборки
Для повышения скорости сборки внесли несколько улучшений:
- Поддержка кэширования конфигурации Gradle для ускорения сборки
- Новый аллокатор памяти в Kotlin/Native помогает улучшить производительность управления памятью Kotlin/Native в рантайме
- Инкрементальная компиляция klib для более быстрой компиляции Kotlin/Native
- Управление кэшем компиляции перенесли в из gradle plugin в компилятор, что позволит дополнительно улучшить время компиляции и гибкость управления этим кэшем
Развитие библиотек
JB представил статистику, по которой с 2021 года количество библиотек KMP постоянно растёт:
Вы можете найти популярные библиотеки по многим направлениям в репозитории KMP-Awesome.
Google переводит библиотеки на Kotlin. Команда Android в Google поддерживает пользователей KMP, предоставляя мультиплатформенные версии библиотек Jetpack. Уже готовы совместимые с KMP библиотеки Collections, DataStore, Annotations и Paging.
Улучшение интеропа со Swift
Уже есть инструменты, позволяющие улучшить интероп со Swift, чтобы ios-разработчикам удобнее было использовать KMP в проектах, например SKIE.
JB планируют продолжать улучшать интероп и добавить поддержку SwiftPM.
Compose multiplatform
Плюс KMP в возможности выбора того, что шарить: бизнес-логика частично или полностью, или даже UI с Compose Multiplatform. Развитие Compose Multiplatform для iOS даст возможность шарить ещё больше кода. По нашему опыту, сейчас мы экономим 20-25% с использованием KMP.
Compose Multiplatform для Android и десктопной версии стабилен. Поддержка iOS в настоящее время находится в стадии альфа-версии, а поддержка веба (Wasm) является экспериментальной.
В релизах часто улучшается iOS-поддержка, например в релизе 1.5.10 обещают улучшение производительности рендеринга и TextField для iOS, улучшенную совместимость с UIKit, увеличение скорости компиляции для iOS с Kotlin 1.9.20. iOS-бета Compose Multiplatrofm планируется в 2024.
При этом уже есть кейсы использования Compose Multiplatform для приложений:
- Концепт зарубежного банковского приложения — статья на Medium.
- Уровень усилий, необходимых в различных сценариях, с использованием KMP (KMM) и без
- Кейс на канале Kotlin by JetBrains о приложении для оптимизации доставки товара на последнем этап пути, когда груз или посылка должны быть доставлены непосредственно до конечного получателя — last mile delivery
Вывод
Стейбл-версию в KMP можно смело использовать в проде. Даже при том, что технологией можно было пользоваться и раньше, сейчас добавилась гарантия совместимости.
JetBrains активно развивает популярность KMP. Можно предположить, что развитие экосистемы и сообщества сильно поможет распространению.
В продолжение развития ждём Compose Multiplatfotrm iOS, который должен сильно улучшить поддержку iOS и ускорить разработку приложений, где нужно шарить UI между платформами.