Kotlin Multiplatform — это набор для разработки программного обеспечения, который значительно лучше других вариантов разработки кроссплатформенных приложений. В этом руководстве по Kotlin multiplatform вы подробно узнаете все об этом наборе.
Что такое Kotlin Multiplatform?
Kotlin multiplatform — это фича, появившаяся в 2017 году вместе с Kotlin 1.2. Данная возможность позволяет писать один и тот же код непосредственно на нескольких платформах, ориентируясь на кроссплатформенную разработку приложений. В ее основе лежит идея подхода "Write Once Run Anywhere" [пиши один раз, запускай везде], но она выводит данную концепцию на гораздо более высокий уровень, позволяя писать код один раз и потом использовать его на нескольких платформах.
Мультиплатформенное программирование на Kotlin позволяет разработчикам решить проблему зависимостей от конкретной платформы. Это сокращает время, затрачиваемое на написание и поддержку одного и того же кода для разных платформ. Kotlin Multiplatform дает возможность включать другие платформы, такие как Linux, Windows и веб (JavaScript), в то время как его подмножество Kotlin multiplatform mobile позволяет разработчикам писать код бизнес-логики для iOS и Android из одной кодовой базы.
Как работает Kotlin Multiplatform?
Kotlin для iOS, Android и других популярных операционных систем позволяет хранить многократно используемые фрагменты кода для двух и более версий приложений.
Возьмем, к примеру, Android и iOS. Общий код бизнес-логики для Android преобразуется в байткод Java, который может быть выполнен в JVM. В Android есть виртуальная машина, поэтому он может легко его выполнить. В случае iOS виртуальной машины нет, поэтому код преобразуется в нативный, который может быть выполнен на iOS.
Теперь в компиляторе Kotlin есть фронтенд, который преобразует код в промежуточное представление (intermediate representation - IR), а бэкенд конвертирует это промежуточное представление в машинный код.
Так, в случае android он преобразует его в байткод java, а в случае iOS - в нативный машинный код iOS.
Общий код Kotlin
Чтобы обеспечить запуск общего кода, в Kotlin предусмотрены компиляторы под конкретные платформы. Для преобразования кода в соответствии с различными платформами предоставляются различные компиляторы. К ним относятся Kotlin/ JVM, Kotlin/ JavaScript и Kotlin/ Native. Эти версии содержат специфичные для конкретной платформы инструменты, библиотеки и расширения языка Kotlin.
Каждая платформо-зависимая версия включает различные платформы; например, JVM содержит Java 8, Java 6 и Android, JavaScript - Browser и Node, а Native - iOS, Mac, Windows, Linux и т.д.
Мультиплатформенные библиотеки помогают при разработке общих частей проекта в одной области, предоставляя API для общего кода Kotlin и впоследствии распространяя его на все целевые платформы.
Версии платформо-ориентированных библиотек предоставляют библиотеки, которые могут быть использованы для расширения специфических возможностей целевых платформ.
Чем мультиплатформенность отличается от кроссплатформенности?
Мультиплатформенная система — в которой программа для разных платформ использует как коды, характерные для каждой из них, так и общий код, используемый обеими платформами.
Кроссплатформенное приложение — это система, позволяющая выполнять деплой приложения с использованием абсолютно одинакового кода приложения.
Основной упор в Kotlin multiplatform делается на совместное использование общего кода, и мультиплатформенность рассматривается как развитие нативной разработки.
Преимущества Kotlin Multiplatform
Поддержка и сообщество: Многие компании и организации выбирают язык Kotlin. Кроме того, после того, как компания Google объявила Kotlin предпочтительным для android, его выбирают многие компании. На этом языке начали работать множество пользователей, что означает огромную поддержку Kotlin со стороны сообщества.
Быстрый и чистый код: В Kotlin multiplatform нет необходимости заново создавать и переписывать код для разных платформ. Можно просто использовать общий код для разных платформ, что экономит огромное количество времени. Такие функциональные возможности, как интероперабельность, также делают работу очень простой и быстрой, и не возникает отставания от нативных платформ; благодаря этому разработчикам не нужно ждать, пока появятся новые фичи для поддержки.
Быстрая разработка: Совместное использование кода экономит массу времени и помогает сделать процесс разработки намного быстрее и проще. Его особенности, включая "нулевую безопасность", поддержку IDE и взаимодействие с Java, делают его менее сложным и быстрым.
Один язык для кроссплатформенных и нативных приложений: Большинство средств разработки кроссплатформенных приложений не позволяют использовать возможности, присущие устройствам на базе iOS и Android. В Kotlin нет необходимости внедрять в кодовую базу новый язык программирования. Можно легко заставить ваше android-приложение работать на iOS-устройствах без значительных изменений в коде.
Компании, выбирающие Kotlin Multiplatform
Netflix: Популярная OTT-платформа Netflix перестроила текущий пользовательский интерфейс плеера в Android-приложении, используя Kotlin.
Autodesk: Autodesk — транснациональная корпорация по разработке программного обеспечения. Kotlin хорошо работает с iOS и android без нативного интерфейса Java, что является основной причиной для компании сделать выбор в пользу Kotlin multiplatform.
Vmware: Vmware — американская компания, занимающаяся облачными вычислениями и технологиями виртуализации. Команде разработчиков Vmware требовалась кроссплатформенная стратегия для мобильных приложений, поэтому был выбран Kotlin multiplatform, и теперь он является "основным фреймворком по умолчанию" для VMware.
Trello: Trello — это приложение для управления проектами. Android-приложение Trello создано с использованием Kotlin. Trello использует Kotlin из-за его совместимости с Java.
Philips: Philips — очень популярная транснациональная корпорация, и вы наверняка слышали об этой компании. В Philips Kotlin Multiplatform оказался более быстрым при имплементации новых возможностей, а также позволил добиться более тесного взаимодействия в команде между разработчиками Android и iOS.
Ice Rock: Ice Rock, аутсорсинговая компания, предоставляющая мобильные и backend-решения для различных отраслей и сегментов рынка, использует Kotlin multiplatform mobile при создании приложений для своих клиентов.
Заключение
В этом руководстве по Kotlin multiplatform вы поняли, как он работает, и изучили, что это такое. Вы также узнали об общем коде Kotlin и выяснили преимущества Kotlin multiplatform. Наконец, вы познакомились с компаниями, которые делают выбор в пользу Kotlin multiplatform.
31 июля пройдет открытый урок, посвященный разработке монолитного приложения со Spring. В результате этого вебинара:
узнаем преимущества и недостатки монолитной архитектуры, фреймворка Spring, особенностей разработки со Spring в Kotlin;
попрактикуемся в разработке работающего монолитного приложения и разместим его в Docker-контейнере.
Вебинар будет полезен разработчикам на Kotlin и Spring. Присоединяйтесь, если интересно.
Комментарии (12)
oldd
30.07.2023 11:00Текущий статус "прототип"?
Так понимаю, в продакшн под десктоп его использовать не следует?
Или у вас есть положительный опыт его использования?
И, если позволите, немного о моем не положительном опыте на линусовском десктопе. Astra linux se
1) kotlin+javafx/tornadofx. Контекстное меню только на первом мониторе. Невозможно исправить вообще.
2) Electron. В астре se стоит запрет на запуск appimage. Обойти настройками можно, но юзеры настраивать не хотят. Распакованный appimage может не запустится из-за настроек песочницы хромиума.
3) Delphi tokio. Вроде и бинарник нормально работает, но Паскаль после котлино это как плавать с гирей на шее. Работает, но радости нету.
HemulGM
30.07.2023 11:00+3Если вы ошиблись местом коммента (а похоже), то отвечу
В продакшен легко можно использовать, не разрешимых проблем нет. Да и в целом все работоспособно. Есть небольшие проблемы с текстовыми полями (Edit, Memo). Есть проблема со скролом на тачскринах (клик отрабатывает раньше чем скролл). Если скролить контент с забирающими фокус контролами, то есть проблемы, если не заменить OnClick на OnTap (но это ерунда). Репорты есть, будут править.В остальном рабочий инструмент с большими возможностями. У меня несколько проектов на проде несколько лет без проблем и жалоб работают (ну, баги моей логики не учитываю).
В Делфи, после Токио версии, много чего изменилось. Как в фреймворке FMX (кардинально), так и в рантайме всего языка. Если научиться пользоваться FMX, то ограничений почти нет. Можно сделать интерфейс любой сложности с анимацией, шейдерами и чем угодно. Я не один раз барл макеты из Figma и в полной мере их реализовал. Без особых проблем или хитростей. Без левых пакетов, на штатных инструментах.
Нужно понимать, что FMX это не кроссплатформенный аналог VCL, это совершенно другой подход ко многим вещам. То, как отображается контрол можно поменять в любой момент, настроить как хочешь и т.д. FMX и его философия чем-то похожа на HTML+CSS. Есть книга стилей, которая управляет тем, как отображается контрол. Стиль в данном случае - это набор других компонентов (контролов, примитивов, анимаций и т.д.). Стиль может состоять из любых доступных элементов на форме. Хочешь, чтоб на кнопке было 15 картинок, делаешь такую кнопку. Хочешь, чтоб она анимировалась при наведении уменьшением или сменой цвета, или перемещением или ещё как придумал - делаешь. Хочешь, чтобы кнопка выглядела как Grid - присваиваешь кнопке стиль грида и она будет выглядеть как грид. И всё это через дизайнер, а не кодом.
Все, кто работал с Делфи знаю, что там создавать интерфейс для работы с таблицами и бд в целом очень просто и удобно. Кинул датасеты, настроил получение данных, указал связи компонентам, которые работают с датасетами и готово. Даже код писать не надо. Так вот в FMX все контролы могут работать с такими связями. Любой контрол, который выводит текст может использоваться для вывода текста из датасета (без кода, с личным форматированием или вычислением значения). Любой список может быть связан с источником данных, а элементы могут выглядеть так как тебе захочется (настроив стиль, хоть для каждого элемента свой). Ты можешь создать сложный элемент списка визуально (как фрейм) и заполнить его без строчки кода из датасета динамически. Стили могут быть как растровые, так и векторные (как сделаешь). А работа с HiDPI из коробки без всяких настроек. Я могу ещё долго продолжать, но это не на одну статью.
Вот после такого опыта, работать с каким-то другим фреймворком - как плавать с гирей на шее.
Главное научиться.
Можешь посмотреть здесь, у меня несколько открытых проектов (я в основном только на FMX делаю) https://github.com/HemulGM
Внимание стоит обратить на:
https://github.com/HemulGM/ChatGPT
https://github.com/HemulGM/HGMGetIt
https://github.com/HemulGM/TaskBoardsFMX
https://github.com/HemulGM/VKMessengerFMX
https://github.com/HemulGM/RainИз не открытых или не залитых
https://www.youtube.com/watch?v=rJzVy29LiYg
https://www.youtube.com/watch?v=hcACtvOO-Ec
https://www.youtube.com/watch?v=U802Uik8IzM
https://www.youtube.com/watch?v=Y_WHERlyahg
https://www.youtube.com/watch?v=nEz3KPEs1_E
adarash
30.07.2023 11:00значительно лучше других вариантов разработки кроссплатформенных приложений
Очень амбициозное заявление. Но бизнес пока вбольшей степени выбирает между флаттер и двумя отдельными приложениями.
september669
30.07.2023 11:00https://medium.com@jacobrass/popular-apps-using-kotlin-multiplatform-kmp-in-2023-and-what-you-can-learn-from-them-1f94d86489b7
Не сказал бы
Gohy
30.07.2023 11:00Интересуют немного более частные моменты вроде специфики кроссплатформенности. К примеру, на Android и iOS требуется сохранить какие-то предустановки. На Android для этого есть SharedPreferences, на iOS — NSUserDefaults. А вот как быть с Kotlin Multiplatform? Видимо, придумывать велосипед с уникальным решением. И это - лишь верхушка айсберга. Хотя, конечно, на данный момент очень радует развитие этого фреймворка, для многого его использование уже более чем предпочтительно
HemulGM
30.07.2023 11:00На Котлине не знаю как, но в Делфи, например, ты можешь использовать API целевой платформы (не забудь директивами только огородить). В итоге можешь просто зарегистрировать интерфейс, который представляет собой сервис, который можно запросить. Регистрировать можешь для каждой платформы свою реализацию (или не регистрировать).
september669
30.07.2023 11:00Есть готовые решения в виде либ для KMM.
Можно использовать платформенные решения, можно собрать свой велосипед.
oldd
Котлин научился делать исполняемый бинарник под linux? Не инсталяшку с явой внутри, а именно чистый бинарник, такой же, как делает delphi и go ? Котлин научился рисовать gui под линуксом без javafx и swing ?
september669
Давно уже может компилироваться через llvm для iOS. Но desktop target это JVM.
jershell
Если коротко, то да и таки достаточно давно. Вот можете тут посмотреть пример ELF64 + ui https://github.com/msink/kotlin-libui
HemulGM
Ага, Делфи ещё лет 5-7 назад так умел делать и достаточно не плохо. Фреймворк был тогда сыроват, но сейчас ситуация куда лучше