Приложения Netflix для Android и iOS Studio — теперь на Kotlin Multiplatform
У команды Netflix Technology Blog вышла статья о том, как компания, которая занимается производством фильмов и сериалов, тоже использует мультиплатформенные технологии. И мы просто не могли не опубликовать перевод.
В последние годы Netflix разрабатывает мобильное приложение под названием Prodicle, чтобы внедрять инновации в производство телешоу и фильмов. Индустрия быстро меняется. Потребности сильно различаются в зависимости от страны, региона и даже от одного производства к другому.
Мы, Netflix Technology Blog, небольшая группа инженеров. Разрабатываем программное обеспечение с большими объемами записи в распределенной среде. Менее чем у трети наших пользователей на съемочной площадке есть надежное соединение без ошибок сети.
Мы обнаружили, что для обслуживания клиентов требуется оптимизация надежности и скорости доставки продукции. Поэтому стали использовать мобильные решения для надежной и автономной поддержки на стороне клиента.
Мы экспериментировали с мультиплатформенной архитектурой. Сейчас мы делаем шаг вперед. Используя Kotlin Multiplatform, мы один раз пишем независимую от платформы бизнес-логику на Kotlin, а затем компилируем ее в библиотеку Kotlin для Android и нативный Universal Framework для iOS через Kotlin/Native.
Что дает Kotlin Multiplatform
Технология позволяет использовать единую базу кода для бизнес-логики приложений iOS и Android. Нужно написать код для конкретной платформы только там, где это необходимо. Например, для реализации пользовательского интерфейса или при работе с API для конкретной платформы.
Kotlin Multiplatform подходит к кроссплатформенной мобильной разработке иначе, чем известные технологии.
В то время как другие технологии абстрагируются или полностью заменяют разработку приложений для конкретных платформ, Kotlin Multiplatform дополняет то, что уже есть. Он ориентирован на замену бизнес-логики, не зависящей от платформы. Условно говоря, это новый инструмент в наборе, а не замена всего набора.
Такое решение подходит нам по нескольким причинам:
- наши студийные приложения для Android и iOS имеют общую архитектуру с похожей или в некоторых случаях идентичной бизнес-логикой, написанной на обеих платформах;
- почти 50% производственного кода в наших приложениях для Android и iOS отделены от базовой платформы;
- ничто не мешает нам изучать новейшие технологии, которые предлагают соответствующие платформы (Android Jetpack Compose, Swift UI и т. д.).
Итак, что мы с этим делаем?
Управление опытом
Как мы уже писали, потребности клиентов различаются в зависимости от производства. Это приводит к большому количеству конфигураций приложений. Они позволяют переключать доступность функций и оптимизировать взаимодействие с приложением для каждой продукции.
Отделение кода, который управляет этими конфигурациями, от самих приложений помогает снизить сложность по мере их роста. Наше первое исследование совместного использования кода включает реализацию мобильного SDK для нашего внутреннего инструмента управления опытом Hendrix.
Hendrix — простой интерпретируемый язык, который выражает способ вычисления значений конфигурации. Эти выражения оцениваются в контексте текущего сеанса приложения. Они могут получать доступ к таким данным, как назначения тестов A/B, местоположение, атрибуты устройств и т. д. В конкретном случае мы настраиваем доступность продукта, версии и региона, наборы функций приложения.
Слабое соединение с сетью вместе с частым изменением значений конфигурации в ответ на пользовательскую активность означают, что предпочтительнее делать анализ правил на устройстве клиента, а не на сервере.
Так мы создали облегченный мобильный SDK Hendrix — отличный от кандидата на Kotlin Multiplatform. Он требует серьезной бизнес-логики и полностью независим от платформы.
Реализация
Пропустим детали про Hendrix и коснемся различий, связанных с использованием Kotlin Multiplatform вместо Kotlin/Swift.
Постройка
Для Android это обычное дело. Hendrix Multiplatform SDK импортируется через Gradle как библиотека Android проекта так же, как и любая другая библиотека. В iOS собственный бинарный код включен в проект XCode как универсальный фреймворк.
Эргономика разработчика
Исходный код Kotlin Multiplatform можно редактировать, перекомпилировать, к нему может быть прикреплен отладчик с точками остановки в Android Studio и XCode (включая поддержку lldb). Android Studio работает «из коробки», поддержка XCode идет через плагин TouchLabs xcode-kotlin.
Сеть
Hendrix интерпретирует набор(-ы) правил — файлы с удаленной настройкой, которые загружаются на устройство. Мы используем мультиплатформенный HttpClient Ktor для встраивания сетевого кода в SDK.
Дисковый кэш
Конечно, подключение к сети не всегда доступно, поэтому загруженные наборы правил нужно кэшировать на диск. Мы используем SQLDelight вместе с драйверами Android и Native Database для мультиплатформенной сохраняемости.
Заключение
Команда Netflix Technology Blog внимательно следит за развитием Kotlin Multiplatform в течение последних нескольких лет. Они считают, что технология достигла переломного момента. Интеграция инструментов и системы сборки для XCode значительно улучшилась. Не нужно писать и поддерживать несколько реализаций для конкретных платформ. И это перевешивает сложности, связанные с интеграцией и обслуживанием.
Возможностей для дополнительного использования кода между студийными приложениями для Android и iOS предостаточно. Новые продукты станут еще интересней, если учесть, что возможна транспиляция Javascript.
Мы в IceRock Development тоже считаем, что за мультиплатформой будущее. Наша компания тоже делает свой вклад в развитие технологии Kotlin Multiplatform:
- https://moko.icerock.dev — наши опенсорс библиотеки для быстрого старта при использовании Kotlin Multiplatform;
- https://t.me/kotlinmpp — телеграм-канал, где тему обсуждают 800+ программистов;
- https://kmp.icerock.dev — сайт с библиотеками и ссылками на проекты;
- https://libs.kmp.icerock.dev — сайт с библитеками для Kotlin Multiplatform.
Приходите к нам, и мы покажем, как Kotlin Multiplatform может быть полезен вашему бизнесу!