Выбираем кроссплатформенное решение для проекта: Kotlin Multiplatform

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

Родион Газизов
старший Android-разработчик ИТ-компании SimbirSoft

Cтарший Android-разработчик ИТ-компании SimbirSoft. В мобильной разработке — более 3 лет.

В ноябре Kotlin Multiplatform (далее — KMP) вышел из режима бета-тестирования, а значит теперь он может занять заслуженное место в триаде кроссплатформенных решений для мобильной разработки вместе с Flutter и React Native. Мы в SimbirSoft имеем опыт работы с каждым из этих решений и хотим познакомить читателей с особенностями этого инструмента. В статье расскажем, для каких проектов он подходит лучше, и поделимся примерами реализованных кейсов.

Особенности Kotlin Multiplatform

Начнем с того, что все мобильные приложения строятся из трех основных компонентов:

  • Пользовательский интерфейс (UI-слой)
  • Бизнес-логика приложения (domain-слой)
  • Работа с внешними источниками данных (data-слой)

Что важно бизнесу? Конечно, чтобы пользователи совершали покупки, заказывали услуги, как можно чаще заходили в приложение и получали удовольствие от его использования. Чтобы обеспечить пользовательский опыт на высшем уровне, интерфейс приложения должен быть максимально нативным, «родным» для каждой платформы (Android, iOS).

Чем здесь может быть полезен KMP? Фреймворк позволяет реализовать нативный интерфейс и использовать общий код для data и domain-слоев, сохраняя возможности и производительность платформы. 

Работая с Kotlin Multiplatform, мы отметили следующие преимущества:

  • Нативный пользовательский интерфейс
  • Высокая производительность. Согласно результатам сравнения KMP и Swift, по скорости выполнения KMP работает лучше, по использованию процессора не уступает, но требует больше оперативной памяти.
  • Переиспользуемый код, благодаря которому повышается скорость разработки. Проектирование, написание кода, тестирование — все это можно сделать один раз и использовать в обоих платформах. А это значит, что бизнес может сэкономить время и деньги.
  • Простота внедрения. KMP позволяет постепенно «встраиваться» в проект. При этом разработка новых функций будет продолжаться. Это главное отличие от других популярных кроссплатформенных фреймворков, о которых мы поговорим ниже.
  • Снижение стоимости проекта. Как показывает наша практика, за счет внедрения KMP стоимость проекта можно сократить до 25%.

С этим инструментом уже работает Яндекс, Okko, Philips, Netflix и другие крупные компании по всему миру.

Однако у KMP есть и проблемы, решением которых уже занимается команда разработки:

  • Отсутствие готового фреймворка для пользовательского интерфейса (UI). Таким образом, в командах разработки на KMP должны присутствовать специалисты по созданию интерфейса на Swift и Kotlin.
  • Низкая скорость сборки проекта относительно нативных фреймворков и Flutter с React Native. Каждый раз, когда разработчик проверяет работу кода, компьютер «собирает» проект для конечного устройства (iOS или Android). Происходит множество сложных процессов, в результате которых код становится приложением.
  • Компиляция кода из Kotlin в Objective-C. Это влечет за собой некоторые ограничения при разработке. Но благодаря энтузиастам появились инструменты (например, Skia), которые позволяют компилировать код из Kotlin в Swift, тем самым упрощая разработку.
  • Отсутствие удобной полиглотной среды разработки (IDE) и аналога функции hot reload из Flutter. В отличие от разработки на Flutter, Kotlin-разработчику придется использовать две IDE: Android Studio и xCode. Для применения изменений в коде потребуется пересобирать проект, что в совокупности с длительным временем сборки может осложнить разработку.
  • Недостаточно подробная документация и малое количество примеров. С одной стороны, KMP прост в использовании, чтобы делать по нему большую документацию, с другой стороны, разработчики иногда имеют дело с непростыми кейсами, решение которых трудно найти при отсутствии у специалиста необходимого опыта.

Безусловно, на рынке уже есть успешные решения для создания кроссплатформенных мобильных приложений — Flutter и React Native. Главное отличие — эти фреймворки позволяют писать пользовательский интерфейс один раз для нескольких платформ. А KMP на данный момент пока не предоставляет готового инструмента для UI. При этом он является единственным актуальным кроссплатформенным решением для создания общей бизнес-логики в проектах, использующих нативный UI на Swift или Kotlin. 

Напомним, что такой UI необходим, когда в проектах есть сложный дизайн, анимации и тяжелые платформенные компоненты.

Выбираем кроссплатформенное решение для проекта: Kotlin Multiplatform
При использовании Flutter или React Native проект становится «зависимым» от этих технологий — с них очень тяжело мигрировать на нативные языки. Есть отличия и в том, как они создают UI. Flutter использует высокопроизводительные движки Skia или Impeller, которые сами отрисовывают виджеты. React Native идет по другому пути и обращается к платформенным виджетам, из-за чего интерфейс на платформах будет выглядеть по-разному. KMP пошел по пути Flutter. Он способен создавать высокопроизводительный интерфейс на движке Skia, но есть существенное отличие от Flutter — KMP позволяет делать это постепенно, в необходимом количестве, а не «все и сразу».

Важно отметить, что Flutter и React Native используют Dart и JavaScript (TypeScript) соответственно. Эти языки программирования сильно уступают в лаконичности, удобстве и читабельности Swift и Kotlin. Этот факт признают и сами кроссплатформенные разработчики. В то же время Swift и Kotlin являются новыми, очень похожими друг на друга языками, а значит разработчикам будет удобнее «понимать» друг друга.

Для каких продуктов подходит Kotlin Multiplatform

  • Для множества существующих приложений, написанных на Kotlin и Swift. 

Такие проекты практически невозможно перенести на Flutter или React Native — приложение приходится переписывать заново. KMP позволит сохранить нативный UI и внедрить общую кодовую базу, которую легче поддерживать.

Выбираем кроссплатформенное решение для проекта: Kotlin Multiplatform

Кейс 1. Обновление мобильного SDK для сервиса онлайн-платежей. Согласно ТЗ, нашей команде нужно было усовершенствовать систему проведения платежей и провести глубокий рефакторинг приложения для дальнейшего развития. Кроме того, SDK должен был уметь настраивать вид приложения при подключении новых клиентов. 

Решение. Поскольку эту систему должны были использовать в нативном коде Android и iOS, разработка велась на Kotlin Multiplatform. Это помогло сократить срок и устранить необходимость в двух командах разработки, а также обеспечить одинаковое поведение программы на обеих платформах. Подробнее о проекте можно почитать тут.

  • Для приложений, в которых происходит много обращений к системному API или есть сложные компоненты (например, AR), но вы хотите использовать мультиплатформу. 

В таком случае проще использовать нативные языки каждой платформы и иметь общую логику, написанную на KMP. 

Кейс 2. Создание экрана предпросмотра планировки и меблировки квартиры перед покупкой. Нашей команде предстояло реализовать AR-фичу на Android и iOS в сжатые сроки.

Решение. Исходя из требований, мы не могли разрабатывать такой сложный компонент отдельно для каждой платформы, поскольку это повлекло бы дополнительные издержки на тестирование, проектирование, документацию и согласование логики работы модуля между командами. Решением стала возможность Kotlin Multiplatform обращаться к платформенным зависимостям при работе с AR, а также подключать этот модуль как библиотеку. Вся бизнес-логика была вынесена в мультиплатформу. Оставалось лишь провести настройку при интеграции его в приложение. В результате обновление было готово к релизу в установленные заказчиком сроки.

Выбираем кроссплатформенное решение для проекта: Kotlin Multiplatform
  • KMP прекрасно впишется и в новые проекты, если вы собираетесь разрабатывать их на Kotlin и Swift. 

Всю бизнес-логику можно будет изначально писать на Kotlin, значительно ускоряя разработку и уменьшая конечную стоимость проекта.

Кейс 3. Создание мобильного приложения под iOS и Android с использованием нативных SwiftUI и Jetpack Compose для ритейла.

Решение. Поскольку приложение разрабатывалось с нуля, мы предложили заказчику написать всю бизнес-логику, базу данных и сетевого клиента на Kotlin и использовать его API в обоих решениях. В результате выпустили продукт на месяц раньше обозначенного заказчиком срока. Кроме того, для его реализации потребовалось меньше разработчиков — так мы еще и сэкономили бюджет клиента.

Важно: если вы хотите написать за 1 раз пользовательский интерфейс сразу для Android и iOS, то для этого лучше использовать Flutter или React Native.

Перспективы развития Kotlin Multiplatform

  • Общий пользовательский интерфейс для Android и iOS 

Сейчас создавать общий UI на KMP можно с помощью Compose Multiplatform. Но эта технология еще «сырая». По заявлению разработчиков инструмента, в дальнейшем для Android будет полностью нативное приложение, а для iOS — аналог Flutter.

  • Рост популярности и развитие сообщества 

Согласно индексу TIOBE, который оценивает популярность языков программирования, в ноябре 2023 года Kotlin уже опередил Swift и в 2,4 раза — Dart (язык для Flutter)

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

KMP постоянно развивается и разрабатывать на нем становится все проще и быстрее за счет появления новых инструментов и среды для разработки.

Резюме

Если на вашем проекте по тем или иным причинам используется нативный UI на Swift и Kotlin, можете смело внедрять KMP. Эта технология не потребует приостановки релизов и дополнительных разработчиков.

На наш взгляд, за кроссплатформенными технологиями — будущее. Все они предлагают скорость, экономию, стабильность, но делают с помощью разных подходов и инструментов. Flutter и React Native — отличные UI-фреймворки, но работают по-разному и имеют свои особенности. Kotlin Multiplatform — самый молодой игрок, но он уже пользуется популярностью. А после релиза Compose Multiplatform, Kotlin может стать еще более востребованным языком для кроссплатформенной разработки бизнес-приложений.