Хочется немного рассказать про текущий вектор развития заинтересовавшей меня технологии Kotlin Multiplatform, которая позволяет создавать мультиплатформенные проекты, которые, в свою очередь, очень актуальны в мире мобильной разработке. У многих разработчиков из этого сурового мира существовало желание писать одну общую кодовую базу приложения сразу для нескольких платформ одновременно.
Немного отвлечемся и попытаемся понять, почему Kotlin Multiplatform. Казалось бы, что такой трюк можно успешно провернуть, например, если использовать какие-нибудь кроссплатформенные SDK и фреймворки, например, React Native или, набирающий на данный момент обороты, Flutter. Но это путь кроссплатформы с широко известным лозунгом "написано единожды, работает везде" от Java. Такой подход имеет много недостатков, например, отсутствует привычный для пользователя системы нативный графический интерфейс с привычной анимацией и особенностями. Кроссплатформенные решения не позволяют повторно использовать уже ранее написанные различные нативные библиотеки, поэтому встает вопрос о необходимости заново переписывать наработки на новые непонятные языки.
Хорошо, тогда можно поступить более хитро, отказаться от кроссплатформы и, например, написать весь наш разделяемый код на C++, компилировать под конкретную платформу, подключать и использовать. Звучит, с одной стороны, заманчиво, но тут снова можно наткнуться на различные сложности и подводные камни, например, с использованием родных для Android библиотек на Java в связке с C++. Ну и если упомянуть тот самый язык C++, например, перед морально неподготовленным Android разработчиком, можно столкнуться с undefined behavior с его стороны. Но если без шуток, то C++ не является широко распространенным среди разработчиков мобильных приложений, а он на несколько порядков сложнее в освоении, чем тот же Dart и требует более вдумчивого подхода, чем Java. И вообще хочется использовать удобное в применении решение, желательно чтобы оно работало с Gradle и запускалось в несколько нажатий кнопок.
И таким решением является Kotlin Multiplatform, которое предлагает писать разделяемый код на языке Kotlin (который уже широко известен и активно используется в сфере Android разработке), сохраняет возможность создавать тот самый родной пользовательский интерфейс средствами конкретной платформы, позволяет повторно использовать нативные для платформы библиотеки. В общем, звучит обнадеживающе и интересно, поэтому многие мобильные разработчики и компании устремили свой взор именно в это сторону, что уже на сегодняшний день приносит свои плоды в мультиплатформенный мир.
И одним из таких плодов является moko (Mobile Kotlin) - набор открытых мультиплатформенных библиотек, которые облегчают и ускоряют создание проектов для мобильных платформ Android и iOS в рамках технологии Kotlin Multiplatform.
На данный момент набор уже включает в себя целый ряд следующих решений, например:
- moko-core - модуль, включающий в себя базовые решения и абстракции для удобного использования их в разделяемом коде, например, классы Color, Timer и т.д.
- moko-mvvm - включает в себя реализацию подхода Model-View-ViewModel для разделяемого кода, содержит реализацию мультиплатформенной LiveData
- moko-resources - реализация мультиплатформенных ресурсов для использования в разделяемом коде
- moko-permissions - библиотека для реализации в общем коде логики предоставления рантайм разрешений для устройства
- moko-media - классы для работы в общем коде с медиа, с изображениями, видео плеером
- moko-fields - реализация пользовательских форм и полей для ввода
- mobile-multiplatform-gradle-plugin - плагин для Gradle, который упрощает настройку мультиплатформенного проекта
- и многое другое
В данный момент работа над библиотеками находится в крайне активной фазе и очень быстро появляются новые библиотеки, поэтому все актуальную информацию стоит искать на официальном сайте moko.icerock.dev (где перечислены все предлагаемые решения) или в открытых репозиториях на Github: github.com/icerockdev.
В среднем требования для использования данных библиотек следующие (но стоит уточнять в readme для конкретной библиотеки):
- Gradle 5.4.1
- Android API 21
- iOS 9.0
Если коротко, то в чем суть? А суть в следующем, что вы создаете мультиплатформенный проект, подключаете Gradle плагин (или просто клонируете из репозитория уже полностью готовый, но пустой шаблон), подключаете необходимые мультиплатформенные библиотеки, пишете единую разделяемую логику сразу для Android и iOS, а в платформенных модулях лишь верстаете и наводите нативную красоту привычным движением рук - и в итоге получаете два готовых приложения. Это если коротко.
А если более подробно, то в следующих статьях я планирую уже детальнее рассказать, как создать мультиплатформенный проект, как подключить moko библиотеки к проекту и как с их помощью упростить себе жизнь при работе с Kotlin Multiplatform.