Статья опубликована в рамках: CXXIII Международной научно-практической конференции «Научное сообщество студентов XXI столетия. ТЕХНИЧЕСКИЕ НАУКИ» (Россия, г. Новосибирск, 09 марта 2023 г.)
Наука: Информационные технологии
Скачать книгу(-и): Сборник статей конференции
МУЛЬТИПЛАТФОРМЕННАЯ РАЗРАБОТКА НА БАЗЕ ОБЩЕГО КОДА
MULTIPLATFORM DEVELOPMENT BASED ON A COMMON CODE
Oleg Larionov
student, ISiT faculty, St. Petersburg State University of Telecommunications. prof. M. A. Bonch-Bruevich,
Russia, Saint-Petersburg
Sergey Medvedev
scientific supervisor, Candidate of agricultural sciences, St. Petersburg State University of Telecommunications. prof. M. A. Bonch-Bruevich,
Russia, Saint-Petersburg
АННОТАЦИЯ
Одним из важнейших выборов при разработке ПО является выбор платформы. Существует следующий ряд платформ: Web, Desktop и Mobile. Мобильную платформу, по причине серьёзных различий систем, следует разделить на IOS и Android. [3] Можно продолжать деление, однако перечисленные варианты являются наиболее популярными среди пользователей. Очевидно выгоднее покрывать несколько платформ, если не все сразу, однако это требует дополнительных временных и денежных затрат. В данной работе описываются способы, позволяющие покрыть несколько платформ, при этом минимизируя затраты на разработку.
ABSTRACT
One of the most important choices in software development is the choice of platform. There are the following platforms: Web, Desktop and Mobile. Due to serious system differences, the mobile platform, should be divided into IOS and Android. You can continue dividing, but the options listed are the most popular among users. It is obviously better to cover several platforms, if not all at once, but this requires additional time and money. This paper describes ways to cover multiple platforms while minimizing development costs.
Ключевые слова: мультиплатформа, общий код, KMM, Flutter, React Native.
Keywords: multiplatform, common code, KMM, Flutter, React Native.
При выборе платформ для разработки, оптимальным подходом будет выбрать основную целевую платформу, которая будет приоритетнее остальных. Этот выбор поможет определиться с тем, какие технологии лучше использовать при разработке. В случае если одна из дополнительных платформ начнёт набирать популярность среди пользователей, можно будет начать уделять её разработке больше внимания, возможно добавляя код, написанный исключительно для этой платформы, однако для начала проще сконцентрироваться на чём-то одном. Рассмотрим существующие на рынке решения.
Kotlin и Jetpack Compose
Kotlin – строго типизированный язык общего назначения, разработанный Jetbrains. Самой привлекательной его особенностью для разработчиков стала полная взаимозаменяемость с Java. Несмотря на это, Kotlin является не только JVM языком, и может так же компилироваться в нативный код и Javascript, что позволяет использовать его для мультиплатформенной разработки. Наибольшую популярность Kotlin получил в Android разработке. Cейчас Jetbrains прикладывают большие усилия к адаптации языка под IOS, взаимозаменяемость с Objective-C и Swift [7], позволяя делить один общий слой логики в IOS и Android приложениях. Данную технологию они называют Kotlin Multiplatform Mobile (KMM). Благодаря возможности Kotlin компилироваться также в Javascript и Java Bytecode, мы можем переиспользовать этот слой логики ещё и в Desktop и Web приложениях, а возможность языка работать совместно с нативными языками платформы, позволяет использовать нативные инструменты и функции с минимальным объёмом различного кода на платформах [6]. Таким образом раздельным остаётся только UI. Многие кто интересуется данным подходом к разработке предпочитают останавливаться на одном общем слое логики, однако можно пойти и дальше.
Jetpack Compose – декларативный, реактивный графический фреймворк, основанный на состояниях, разработанный Google* в качестве нового тулкита для создания интерфейсов на Android. Позже Jetbrains занялись доработкой фреймворка, позволив использовать его не только для Android, но и для Desktop и Web разработки. На данный момент Compose for Web заметно отличается от версий для Android и Desktop, исключая возможность переиспользования UI кода для Web платформы. Jetbrains работают над добавлением нового метода рендеринга с использованием Canvas, что должно вернуть эту возможность, однако пока доступна лишь экспериментальная версия данной технологии. Похожая ситуация складывается и с IOS, поддержка Compose на данной платформе доступна лишь в экспериментальной версии фреймворка. В примерах кода от Jetbrains, использующих экспериментальную версию [8], можно увидеть проекты, где используется общий Compose UI для всех перечисленных в данной работе платформ.
Учитывая популярность возможности Kotlin взаимодействовать с нативным инструментарием выбранной платформы, важно отметить, что в общем коде использование нативных инструментов платформы невозможно. Потому зависимости следует составлять из библиотек и фреймворков, разработанных на языке Kotlin.
Касательно производительности, на Desktop платформах Kotlin использует JVM и примерно равен языку Java, который продемонстрировал себя как надёжный и производительный язык в Backend и Desktop разработке. В Web разработке Kotlin уступает Javascript, однако производительность достаточно хороша и сейчас язык активно используется для написания библиотек для Javascript. В Android разработке Kotlin является нативным языком, и потому гарантирует максимальную возможную производительность. На стороне IOS Kotlin использует LLVM для компиляции в нативный код и оптимизации, как и Swift, нативный для IOS язык [5], что приводит к схожей производительности.
Dart и Flutter
Dart – строго типизированный язык общего назначения, разработанный Google*. Язык ориентирован на использование в клиентских приложениях, может компилироваться в машинный код и Javascript. При выходе язык не нашёл особой популярности, однако его использование выросло с появлением фреймворка Flutter.
Flutter – декларативный, реактивный графический фреймворк, основанный на состоянии, разработанный Google* [1]. Многие подобного рода фреймворки похожи как по описанию, так и по использованию, что позволяет при нужде перейти на использование другого фреймворка с сохранением большей части знаний. Flutter набрал популярность за счёт того, что позволяет позволяет создать Android и IOS приложения из одного общего кода как логики, так и UI. Flutter использует графический движок Skia, что позволяет ему выводить собственные пиксели на экран, за счёт чего и стало возможным переиспользование UI кода. Также это помогает создавать полностью уникальные интерфейсы, хотя в арсенале Flutter имеются и готовые элементы в стилях Material (Android) и Cupertino (IOS). В мобильной мультиплатформенной разработке, Flutter является готовым решением и уже достиг своей третьей версии.
Так же фреймворк позволяет из того же кода создавать Desktop и Web приложения. Обе эти опции ещё находятся в разработке. Возможность разрабатывать на Flutter Desktop приложения уже испытывается в реальных условиях рядом компаний. Веб приложения с Flutter, на данный момент, используют Canvas и имеют череду багов, связанных с этим подходом, которые вынуждают писать дополнительный код специально для веб версии приложения.
На конференции Flutter Forward [9] разработчики заявили ряд нововведений и обновлений. Среди перечня грядущего функционала прозвучало что в дальнейшем Flutter будет поддерживать Web Assembly, что, возможно, решит часть существующих проблем с его использованием для веб разработки.
Сильно ориентированные на мультиплатформенную разработку, Flutter и Dart заметно упрощают написание часто необходимого функционала, например использование локального хранилища, которое отлично на каждой платформе, вдобавок технология является более зрелой, чем Kotlin и Compose, однако такая ориентация означает трудности в использовании нативного функционала платформ. Данная проблема, возможно, решится в дальнейшем, так как на конференции было заявлено, что над этим вопросом ведётся работа. Так же это означает, что Flutter уступает в каждой платформе нативным языкам с точки зрения производительности, однако, как видно на рисунках 1 и 2, разница довольно мала, и в большинстве случаев будет незначительной.
Несмотря на такой функционал и довольно хороший опыт пользования, предложений о работе с Flutter мало, и пока он больше используется самостоятельными разработчиками.
Javascript и React Native
Javascript – Самый популярный на сегодняшний день язык по ежегодному опросу Stack Overflow. Это динамически типизированный язык, преимущественно используемый в веб разработке. Сейчас практически ни один сайт не обходится без его использования, и рассмотренные ранее языки сами компилируются в Javascript, чтобы позволить своё использование во фронтэнде. Благодаря своей популярности, данный язык смог выйти за рамки фронтенда, и сейчас его можно использовать для практически любого рода разработки, хотя в основном язык продолжает использоваться для разработки клиентских приложений.
React Native – фреймворк разработанный Facebook**, который позволяет создавать Android, IOS и Web приложения на базе общего кода [2]. Javascript, как и Dart, не является нативным языком для мобильных систем, однако при использовании React Native, элементы, написанные с помощью Javascript транспилируются в нативные для каждой платформы [4], лишая нужды в использовании дополнительного графического движка, как в случае с Flutter.
Как и ReactJs, React Native является минималистичным фреймворком, предоставляя лишь самое необходимое и рассчитан на использование со сторонними библиотеками. React Native совместим со многими популярными Web и ReactJs библиотеками, однако перед добавлением зависимости в проект стоит убедиться в совместимости. В добавок React Native имеет ряд сторонних библиотек, разработанных специально для него.
React Native довольно популярен для мобильной и мультиплатформенной разработки, во многом за счёт того, что он покажется знакомым многим разработчикам фронтэнда, в добавок он популярен на рынке труда. Однако он имеет серьёзный минус в плане производительности на мобильных платформах.
Так как Javascript не является языком нативной разработки для мобильных платформ, приложения, написанные на нём с использованием React Native работают в двух потоках, один из которых отвечает за графические элементы, транспилированные из Javascript в нативные, второй поток, в свою очередь, использует нативный Javascript engine, чтобы выполнять на нём логику приложения. Эти два потока общаются друг с другом через мост. Это, в свою очередь, приводит к дополнительной задержке. Приложения, написанные таким образом, требуют больше оперативной памяти, сильнее нагружают процессор и быстрее сажают заряд устройств. Потому для сложных задач рекомендуется писать нативные модули на родном для платформы языке.
Сравнение производительности всех приведённых в данной работе технологий [10] можно увидеть на следующих рисунках. В качестве бенчмарка использовались два алгоритма вычисления числа π.
Рисунок 1. Тест с интенсивным использованием памяти (алгоритм Гаусса-Лежандра) для Android
Рисунок 2. Тест с интенсивным использованием процессора (алгоритм Борвейна) для Android
По результатам бенчмарков видно, что наиболее производительным остаётся нативный код. React-native, используя интерпретируемый и не нативный для системы язык, испытывает большие трудности и нагружает систему значительно сильнее других решений. Flutter использует компилируемый язык, что позволяет ему серьёзно превзойти React-native как в плане нагрузки на процессор, так и требований к памяти. Flutter всё ещё уступает нативным языкам, однако в данном случае разница незначительная, особенно с точки зрения использования памяти.
Каждая из приведённых технологий позволяет переиспользовать код для разработки приложений на несколько платформ, получить больше продуктов с примерно тем же количеством труда и времени. У каждой из них разные целевые платформы, так React Native отлично работает в Web среде, Kotlin и Compose позволяют получить максимальную производительность в Android, Flutter хорошо работает на обеих мобильных платформах. В конечном итоге при выборе одной из этих технологий нужно основывать на целевой платформе.
*(По требованию Роскомнадзора информируем, что иностранное лицо, владеющее информационными ресурсами Google является нарушителем законодательства Российской Федерации – прим. ред.)
**(Facebook, согласно судебному решению, в России признана экстремистской организацией - прим. Редакции)
Список литературы:
- Rap Payne. Beginning App Development with Flutter: Create Cross-Platform Mobile Apps.
- Bonnie Eisenman. Learning React Native: Building Native Mobile Apps with JavaScript.
- Shaun Lewis. Native Mobile Development: A Cross-Reference for IOS and Android Native Programming
- Adam Boduch, Roy Derks. React and React Native: A complete hands-on guide to modern web and mobile development with React.js
- Дэвид Марк, Джек Наттинг, Джефф Ламарш, Фредрик Олссон, Ким Топли. Swift. Разработка приложений в среде Xcode для iPhone и iPad с использованием iOS SDK
- Официальные туториалы по Kotlin Multiplatform [Электронный ресурс] https://kotlinlang.org/docs/multiplatform.html#kotlin-multiplatform-use-cases
- Официальная документация Kotlin Multiplatform Mobile. [Электронный ресурс] https://kotlinlang.org/docs/multiplatform-mobile-getting-started.html
- Официальные примеры использования эксперементальной версии Compose в мультиплатформенном проекте. [Электронный ресурс] https://github.com/JetBrains/compose-jb/tree/master/experimental/examples
- Запись конференции Flutter Forward 2023. [Электронный ресурс] https://www.youtube.com/watch?v=zKQYGKAe5W8
- Сравнение производительности Flutter и react native с нативной разработкой [Электронный ресурс] https://medium.com/swlh/flutter-vs-native-vs-react-native-examining-performance-31338f081980
Оставить комментарий