logo
Mobile
Максим Колмогоров
Максим Колмогоров
Разработка сайтов

Kotlin Multiplatform Mobile: что такое, какие плюсы и минусы

Ниже представленная информация – субъективное мнение автора. Автор статьи практикующий программист с опытом работы более 6 лет. На момент написания статьи автор реализовал 3 проекта на KMM и более 10 на Swift, Kotlin/Java. Также, автор знаком с React Native и Cordova. Поэтому, ему есть с чем сравнивать.

Kotlin Multiplatform Mobile: что такое, какие плюсы и минусы

Что такое Kotlin Multiplatform Mobile

Далее, в статье автор будет использовать сокращение KMM.

KMM – это технология, с помощью которой можно разрабатывать мобильные приложения для iOS и Android с использованием Kotlin. Иными словами, это инструмент для кроссплатформенной разработки мобильных приложений.

Но, тут хотелось бы отметить что эта кроссплатформенная разработка сильно отличается от привычной на Flutter, React Native и Cordova.

Как разрабатывают на KMM

Когда разрабатывают мобильные приложения на React Native или Cordova, то в основном пишут код для приложения на JavaScript. Более 90% кода в этих приложениях программист пишет на JavaScript. Чтобы делать приложения на этих инструментах не нужно знать языки Java, Kotlin и Swift, достаточно одного JavaScript.

Но если речь идет о KMM, то тут совсем другая ситуация. Тут разработка состоит из трех этапов.

Разработка интерфейса для iOS (iosApp)

Когда инициализируется проект на KMM в Android Studio, то в папке проекта появляется множество подпапок и разных файлов. Основные три папки на которые стоит обратить внимание это: iosApp, androidApp, shared.

В папке iosApp располагается полноценный iOS проект на Swift и SwiftUI.

разработка интерфейса для ios

И, конечно же, его можно запустить в Xcode, дабы вести полноценную разработку iOS приложения.

разработка интерфейса для ios в xcode

Да-да, разработка внешней части мобильного приложения под iOS будет происходить на Swift. Вообще, когда делается интерфейс для iOS, можно даже Android Studio не открывать и работать только в Xcode какое-то время.

Разработка интерфейса для Android (androidApp)

Раз разработка интерфейса под iOS происходит с помощью Swift, то естественно, разработка интерфейса для Android идет на Kotlin и Jetpack Compose.

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

Тут в голову может закрасться вопрос: “А в чем тогда прикол KMM, если мы все равно пишет на нативе?”.

Разработка кроссплатформенного кода (shared)

И вот тут наступает самая интересная часть разработки на KMM. Папка shared содержит в себе кроссплатформенный код, который пишется на Kotlin, но обращаться к нему можно из интерфейса (внешней части) на iOS (Swift) и Android (Kotlin).

Давайте лучше покажем пример. Вот class в папке shared с функцией, которая отдает строку:

описание класса в shared модуле

И результат этой функции мы можем вызвать как в Android:

вызов shared класса в android

Так и в iOS:

вызов shared класса в ios

Как работает папка shared

Папка shared состоит из трех подпапок: commonMain, iosMain, androidMain. И как Вы догадались, у каждой папки своя собственная задача.

Папка commonMain

В папке commonMain описывается класс, который будет доступен в iosApp и androidApp. Как раз выше на скриншотах мы это и показали.

Для KMM есть разные готовые модули (как пакеты из NPM для JavaScript), которые были разработаны другими программистами или командой KMM. Если используется такой модуль, например Ktor, с помощью которого можно совершать HTTP-запросы, то дальше папки commonMain никаких действий не нужно предпринимать. Просто импортируется нужный класс (с помощью Gradle), создается какой-то свой код, ну и используется.

А если же нужно создать свой кроссплатформенный модуль, то тогда надо использовать две другие папки.

Папки iosMain и androidMain

Чтобы создать свой кроссплатформенный модуль, нужно сначала создать в папке commonMain интерфейс или абстрактный класс, а далее в папке iosMain написать реализацию этого класса для iosApp, а после проделать тоже самое с папкой androidMain для androidApp.

пример реализации своего кроссплатформенного кода

Особо внимательные заметили, что реализация модуля для iosApp в папке iosMain происходит на Kotlin, а не на Swift.

Да, это так. Модули для iOS пишутся на Kotlin, а после KMM транспайлирует все это в Objective-C библиотеку, которая используется в интерфейсе (внешней части) для iOS.

Единственная важная вещь, с которой придется столкнуться при такой разработке – это разница в типах Swift/Objective-C и Kotlin. Но разработчики KMM все предусмотрели, поэтому создали систему сопоставления (или “мапинг”). Есть специальная таблица, в которую придется первое время очень долго смотреть и сравнивать типы данных, дабы писать корректный код:

таблица сопоставления kotlin и swift/objective-c

Для чего все это нужно

Если Вы разрабатываете много мобильных приложений, рано или поздно начинает надоедать делать одну и ту же бизнес-логику из раза в раз. И тем более, это одно и тоже на двух разных платформах. Поэтому, весь подобный повторяющийся код очень удобно выносить в shared модули, создавать свои пакеты и импортировать в уже другие совсем новые проекты.

Конечно, бизнес-логика не повторяется, тут речь скорее про то, что бизнес-логика обращается к одному и тому же функционалу (геолокация, HTTP-запросы) и задействует одни и те же методы, просто ответы на эти действия в разных приложениях разные.

Плюсы и минусы KMM

Раз теперь читатели познакомились с KMM хотя бы теоретически, то можно поговорить про его плюсы и минусы. Все что будет написано ниже – это субъективное мнение автора, поэтому кто-то может быть с этим не согласен… это нормально.

Плюсы KMM

1. Мощь нативной разработки при кроссплатформенном подходе

С помощью такой организации разработки, программист всегда имеет доступ к нативной части приложения, поэтому если что-то пойдет не так, то он всегда сможет писать на чистом нативе.

2. Скорость разработки

В сравнении с нативной разработкой на Java/Kotlin и Swift.

С помощью shared модулей скорость разработки мобильных приложений возрастает. Да, до скорости разработки на React Native и тем более Cordova очень далеко, но это все равно в среднем на 20% быстрее, чем писать приложения на чистом Swift или Kotlin. Как раз эти 20% на себя забирают shared модули, в которых описывается бизнес-логика.

Эти 20% взяты не с потолка, а основываясь на трекинге времени в нашей CRM.

3. Максимальная производительность

Из-за того что часть для iOS приложения пишется на Kotlin и транспайлируется в Objective-C по факту у нас получается нативное приложение. Ну а разработка Android версии и так идет на Kotlin. Поэтому, скорость работы KMM приложений равняется скорости нативных приложений.

Минусы KMM

1. Высокий порог входа

Чтобы начать разрабатывать на KMM, надо знать как минимум Swift и Kotlin, поэтому этот инструмент для опытных мобильных разработчиков.

2. Скорость разработки

В сравнении с другими кроссплатформенными инструментами, например Flutter, Cordova и React Native.

Это почти такая же нативная разработка, которая занимает куда больше времени, чем разработка на других кроссплатформенных инструментах. Поэтому, делать “быстрое” MVP на KMM не самая хорошая идея, он совсем для других вещей.

Итог

KMM – это отличный инструмент для разработки мобильных приложений для нативных разработчиков. С помощью KMM можно упростить и ускорить часть разработки за счет кроссплатформенных (shared) модулей. На KMM не стоит делать “быстрый” MVP, если есть возможность использовать другие инструменты, ведь KMM это не про “быстро и дешево”. KMM следует рассмотреть тем компаниями, которые уже нацелены на натив, дабы немного упростить и удешевить разработку.

Разработка приложений
Получите персональную стоимость на разработку мобильного приложения сегодня
Нажимая на кнопку, вы даете согласие на обработку персональных данных и соглашаетесь c политикой конфиденциальности

Оставьте комментарий

Нажимая на кнопку, вы даете согласие на обработку персональных данных и соглашаетесь c политикой конфиденциальности

Комментариев: 1

Илья
01.08.2023 11:16:52
Спасибо, очень интересная статья!