android app development
September 4, 2020

Кроссплатформенная разработка - что выбрать?

Если бы меня несколько лет назад спросили про кроссплатформенную разработку мобильных приложений, то никаких лестных слов у меня бы про нее не нашлось - я был молод, неопытен и полон энтузиазма, "Только нейтив, только хардкор!" - таков был мой лозунг. Но годы идут, взгляды меняются, а цензурные выражения в отношении Android иссякают. В голову начали закрадываться мысли: можно ли писать под обе платформы одновременно, при этом получать результат быстрее, чем по-отдельности и не обречь себя на вечные муки в будущем? Ко всему прочему назрела необходимость сделать несколько простых приложений.

Исходные условия

  • нужно быстро делать mvp (minimum viable product) под Android и iOS
  • есть опыт разработки под Android
  • под iOS опыт отсутствует
  • нет мака
  • немного практики в C# и js

Кандидаты

Выбирал из того, что было на слуху, по популярности и наличию опыта:

  • Kotlin Multiplatform
  • React Native
  • Xamarin
  • Flutter

Но еще до анализа вариантов не покидало ощущение, что react и xamarin пойдут лесом.

Отличия

Если отбросить все второстепенные факторы, такие как язык, коммьюнити, сторонние библиотеки, хвалебные/гневные обзоры и т.д. то, на мой взгляд, останется единственная вещь, отличающая один фреймворк от другого - подход к отрисовке UI.

  • Коtlin Multiplatform - по сути это не фреймворк, а SDK, с помощью которого можно вынести общий код в платформонезависимую библиотеку, задача UI решается на каждой платформе отдельно.
Коtlin Multiplatform
  • React и Xamarin используют обертки над нативными элементами ОС
React и Xamarin
  • Flutter реализует собственный механизм рендеринга без привязки к платформе
Flutter

Выбор

Не Kotlin( Kotlin Multiplatform - наиболее перспективный подход к кроссплатформенной разработке, но к сожалению, этот вариант пришлось отбросить ввиду отсутствия макбука и времени верстать под разные платформы по отдельности. Оставлю этот вариант на будущее.

Не React и Xamarin - с этими двумя расстаюсь без сожаления, C# - не самый мой любимый язык, а про js и говорить нечего. Xamarin теряет популярность, а реакт был создан фейсбуком, на нем, собственно, и написано мобильное приложение Facebook, при виде которого начинаешь плакать кровью.

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

Flutter. Каких-то иллюзий относительно этого фреймворка я не питаю - технология относительно новая, репозиторий кишит багами, Dart по сравнению с Kotlin - шаг в прошлое, но с независимым рендерингом можно не париться о платформенных вещах, а следовательно делать приложения быстрее. Поэтому я пока что остановился на этом варианте.

Flutter + Kotlin

Такая связка выглядит наиблее многообещающе - на стадии mvp можно по-быстрому сделать UI на flutter, а логику на Kotlin Multiplatform, если выстреливает - набрать людей в команду, запилить нативные интерфейсы, при этом большая часть кодовой базы остается платформонезависимой и продолжает развиваться.

Данный подход в каком-то виде можно реализовать уже сейчас - через Flutter Platform Channels, но процесс настройки проекта далек от тривиального. С моим нулевым опытом в Dart/Flutter я не рискнул идти по этому пути до поры до времени.

В идеале хотелось бы иметь возможность собрать Kotlin-модуль с возможностью прямого использования из Flutter, думаю, рано или поздно такая штука появится. А может JetBrains создаст свой аналог flutter с преферансом и распутными женщинами, кто знает?