Flutter на ОС Аврора: как портировать приложения

НачалоЧто такое ОС АврораПодготовка к портированиюПортирование приложенияСравнение с нативом

В августе 2023 года компания «Открытая мобильная платформа» опубликовала инструмент разработки Flutter SDK с начальной поддержкой ОС Аврора. Теперь компании могут перевести свои мобильные решения с Flutter на ОС Аврора. Дмитрий Мозер, Flutter Team Lead в Friflex, рассказывает, как портировать Flutter-приложения на ОС Аврора и что для этого нужно.

ОС Аврора — это российская операционная система, основанная на ядре Linux и оптимизированная под мобильные устройства. Система сертифицирована ФСТЭК России по А4/УД4. Появилась в 2016 году и за пять лет прошла путь от версии 2.1.0 до версии 4.0. Всё это время систему развивали внутри и решали в основном вопросы безопасности, потому что она была рассчитана на B2G и B2B.

Архитектура Авроры схожа с архитектурой Android. У неё есть слой приложений, HAL, Kernel и Common API. И так как это нативный стек, он смешан с Native API.

На Авроре сейчас поддерживается три версии Flutter — 3.3.10, 3.13.5 и 3.16.2. В последней версии к поддержке QT и DART 3 добавили поддержку TextureView. Это значит, что теперь можно писать свои плагины, которые используют камеру и видеоплеер.

У Flutter на Авроре есть несколько ограничений и трудностей:

  • Работает только на физическом устройстве
  • Поддерживаются только специальные версии движка
  • Нужны пакеты совместимости
  • Dart-дебаг и hot reload не «из коробки»
  • C+±дебаг не «из коробки»
  • Реализованы не все Platform API
  • Недостаточно плагинов
  • Не работает на aarch64

Но если посмотреть, что нас ждёт в будущем, то проблем не так уж и много. Специальная версия не то чтобы проблема: работа не на физическом устройстве нам не нужна, а основные плагины уже скоро покроются.

Прежде чем перейти к портированию приложений на Аврору, проверьте, подходит ли вам эта операционная система:

✅ Готовы закупать устройства и ждать их в течение четырёх недель

✅ Готовы дорабатывать для поддержки доступной Flutter-версии

✅ Нет сильной зависимости от Firebase, потому что от него придётся отказаться

✅ Приложение не платное

✅ Можете обойтись без TextureView и PlatformView

✅ Можете обойтись без некоторых API системы — диплинки, интенты

✅ Готовы писать на C++

Для портирования приложения на Аврору вам понадобятся:

👉 Устройства для тестирования

Сейчас вышла пятая версия Авроры, а четвёртая будет поддерживаться ещё год — хорошо иметь и ту и другую версию. Для этого вам пригодятся минимум два устройства.

Устройств на ОС Аврора сейчас не так много, в продаже только недавно появились телефон и планшет.

Ещё у Авроры есть небольшая специфика: у них очень много планшетов. Вам придётся рассмотреть поддержку планшетов, чтобы визуально это всё выглядело так же красиво, как и на телефонах.

👉 Компьютер для разработки

Операционная система macOS x86 считается устаревшей. При этом системы на процессорах M1/M2 не поддерживаются. Начиная с Аврора 4.1 рекомендуется использовать платформы Windows или Linux.

Но это легко обойти с помощью VS Code Remote. Вы можете сделать хост-машину, где уже есть всё необходимое для работы, и удалённо подключаться к ней.

👉 Плагины

Есть три основных типа плагинов:

  1. Те, что нужно сделать на уровне ОС Аврора.
  2. Те, что нужно сделать на уровне Аврора — Flutter.
  3. Любые желающие.

Если у вас в зависимостях есть WebView, PDF, Карты, Firebase, вам придётся как-то это обходить. И если вы сильно на них завязаны, возможно, даже отказаться от портирования и рассмотреть вариант создания нативной версии на QT.

👉 Документация

Документацию можно посмотреть в трёх основных местах:

  1. Native API.
  2. QT.
  3. Freedesktop Software.

Этап 0. Установка SDK и настройка под Аврору. Как это сделать, можно посмотреть на официальном сайте Авроры. Там всё довольно легко.

Этап 1. Добавление поддержки существующих плагинов. Сначала нужно узнать, что поддерживается. Проще всего посмотреть файл .flutter-plugins, который находится в корне проекта. В нём описаны все ваши зависимости.

Смотрите название, ищете внешний плагин во .flutter-plugins у «Мобильной платформы» и заходите в Аврора-плагин.

В Аврора-плагине будет строчка, которую нужно скопировать и добавить в pubspec.yaml.

В pubspec.yaml есть три основных параметра: url, ref и path. Обратите внимание именно на ref, потому что у каждой ветки плагины привязаны к версии движка, а он, в свою очередь, к эмбеддеру. И лучше всего зависеть от хеша этой ветки — так у вас не сломается версия, если поменяется ветка или ещё что-то добавится потом.

Этап 2. Поиск того, что может не работать. Сейчас вы не сможете использовать Google Services, Store API. TextureView можно использовать в новой версии, но понадобится немного усилий.

Чтобы обойти недоступный функционал, нужно убрать некритичное или продумать альтернативный вариант. Проще всего использовать Null Object Pattern: делаете абстрактный класс, который в реализации на Android и iOS будет вызывать это API, а на ОС Аврора ничего не делать.

Этап 3. Выбор API для плагина. У нас есть три основных API: QT Interface, D-Bus Interface и C++ Core Libraries. QT и D-Bus — это интерфейсы к плюсовым библиотекам, но они не всегда там доступны.

К сожалению, не все API везде есть и хорошо работают. Например, D-Bus покрывает примерно 20% C++ Core Libraries. Плюсовые библиотеки тоже не всегда получится использовать, потому что некоторые из них скрыты либо не пройдут сандбокс.

В таком случае стоит рассмотреть QT Slots / Signals. Его особенность в том, что, по сути, это паттерн-обсервер: вы подписываетесь на какие-то события, и вам возвращается коллбэк. Но он может сильно влиять на flow вашего кода, и при этом даже нет гарантии получения ошибок.

Рассмотрим на примере плагина push-уведомлений.

У нас есть метод инициализации, который уже вызывает этот код в нашем плагине. Он обращается в ОС Аврора, оттуда получает ошибку или результат и затем возвращает это обратно. Таким образом, у нас есть ответы в нашем приложении. Подробнее о том, как это работает, можете узнать на нашем пабе.

Если вы используете Flutter в разработке, у вас есть большие преимущества по сравнению с нативной разработкой. Это и более свежий SDK, и большее количество разработчиков, и лучший IDE. Единственные ограничения — не хватает плагинов в поддержке и можно использовать только на физическом устройстве.

Поделитесь увиденным

Скопировать ссылку
ТелеграмВКонтакте