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)


  1. oldd
    30.07.2023 11:00
    +1

    Котлин научился делать исполняемый бинарник под linux? Не инсталяшку с явой внутри, а именно чистый бинарник, такой же, как делает delphi и go ? Котлин научился рисовать gui под линуксом без javafx и swing ?


    1. september669
      30.07.2023 11:00

      Давно уже может компилироваться через llvm для iOS. Но desktop target это JVM.


    1. jershell
      30.07.2023 11:00

      Если коротко, то да и таки достаточно давно. Вот можете тут посмотреть пример ELF64 + ui https://github.com/msink/kotlin-libui


    1. HemulGM
      30.07.2023 11:00

      Ага, Делфи ещё лет 5-7 назад так умел делать и достаточно не плохо. Фреймворк был тогда сыроват, но сейчас ситуация куда лучше


  1. oldd
    30.07.2023 11:00

    Текущий статус "прототип"?

    Так понимаю, в продакшн под десктоп его использовать не следует?

    Или у вас есть положительный опыт его использования?

    И, если позволите, немного о моем не положительном опыте на линусовском десктопе. Astra linux se

    1) kotlin+javafx/tornadofx. Контекстное меню только на первом мониторе. Невозможно исправить вообще.

    2) Electron. В астре se стоит запрет на запуск appimage. Обойти настройками можно, но юзеры настраивать не хотят. Распакованный appimage может не запустится из-за настроек песочницы хромиума.

    3) Delphi tokio. Вроде и бинарник нормально работает, но Паскаль после котлино это как плавать с гирей на шее. Работает, но радости нету.


    1. 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


      1. oldd
        30.07.2023 11:00

        Благодарствуйте за столь подробный ответ!


  1. adarash
    30.07.2023 11:00

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

    Очень амбициозное заявление. Но бизнес пока вбольшей степени выбирает между флаттер и двумя отдельными приложениями.


    1. september669
      30.07.2023 11:00

      https://medium.com@jacobrass/popular-apps-using-kotlin-multiplatform-kmp-in-2023-and-what-you-can-learn-from-them-1f94d86489b7

      Не сказал бы


  1. Gohy
    30.07.2023 11:00

    Интересуют немного более частные моменты вроде специфики кроссплатформенности. К примеру, на Android и iOS требуется сохранить какие-то предустановки. На Android для этого есть SharedPreferences, на iOS — NSUserDefaults. А вот как быть с Kotlin Multiplatform? Видимо, придумывать велосипед с уникальным решением. И это - лишь верхушка айсберга. Хотя, конечно, на данный момент очень радует развитие этого фреймворка, для многого его использование уже более чем предпочтительно


    1. HemulGM
      30.07.2023 11:00

      На Котлине не знаю как, но в Делфи, например, ты можешь использовать API целевой платформы (не забудь директивами только огородить). В итоге можешь просто зарегистрировать интерфейс, который представляет собой сервис, который можно запросить. Регистрировать можешь для каждой платформы свою реализацию (или не регистрировать).


    1. september669
      30.07.2023 11:00

      Есть готовые решения в виде либ для KMM.

      Можно использовать платформенные решения, можно собрать свой велосипед.