WebAssembly, улучшения рендеринга графики и дополнительные возможности для интеграции ИИ. Я, Юра Петров, Flutter Tech Lead в Friflex, делюсь первым переводом официального релиза Flutter 3.22 от Google с комментариями.
WebAssembly
Wasm теперь доступен в стабильной версии. Он предлагает улучшения производительности. Во внутренних тестах в Chrome на MacBook M1 время рендеринга кадров приложения Wonderous улучшилось в среднем в два раза, в худших сценариях — в три раза.
Эти улучшения необходимы для приложений с анимацией и красивыми переходами, в которых важно поддерживать плавную частоту кадров. Wasm уменьшает узкие места в производительности. И мы получаем более плавную анимацию и переходы. Чтобы начать использовать Wasm с веб-приложениями Flutter, изучите документацию Dart Wasm и Flutter Wasm. Полный анонс можно найти в блоге Flutter at Google I/O.
Engine
В 3.22 появились серьезные обновления Impeller, механизма рендеринга, который поддерживает приложения на Flutter. Команда закончила разработку серверной части Vulkan для Android, чтобы сделать графику более плавной и повысить производительность. Оптимизировали эффекты размытия и сложного рендеринга путей. Появился новый экспериментальный API для тестирования с помощью Impeller. В соответствии с дорожной картой, в следующих релизах увеличатся качество и производительность Impeller. Команда планирует завершить миграцию iOS на Impeller и расширить поддержку Android.
Impeller
Бэкэнд-функция Vulkan на Android
В новом выпуске серверная часть Impeller Vulkan для Android стала полнофункциональной. В последние месяцы команда работала над реализацией быстрых расширенных блендов, поддержкой пользовательских фрагментных шейдеров с помощью API FragmentProgram, поддержкой PlatformView (для этого требуется небольшая миграция API), а также полной реализацией стилей размытия.
Предварительная версия на Android
После релиза улучшенной серверной части OpenGL Impeller пользователи получили возможность попробовать Impeller на устройствах Android как с поддержкой Vulkan, так и без нее. После оценки производительности серверной части OpenGL и работы над серверной частью Vulkan, команда сосредоточила усилия на подготовке рабочей части серверной части Vulkan.
Impeller решает проблему сбоев при компиляции шейдеров. В тестах он превосходит устаревший рендерер в среднем по времени кадра на 90 и 99 процентиля. Такую производительность серверной части Vulkan на Android команда считает приемлемой.
В этом релизе приложение, которое поддерживает Impeller, начнет использовать серверную часть Vulkan, если она будет доступна. В следующем релизе серверная часть Vulkan станет значением по умолчанию. Когда приложение с Impeller будет запускаться на устройстве, которое не поддерживает Vulkan, Flutter автоматически будет переключаться на OpenGL ES со Skia. Никаких действий со стороны разработчика не потребуется. Когда серверная часть OpenGL ES Impeller будет готова, этот вариант останется резервный.
Так как предварительная версия Impeller на Android присутствует в релизе 3.22, команда просит разработчиков обновить свои приложения до последней стабильной версии и сообщать о любых проблемах при включении Impeller. Обратная связь на этом этапе имеет неоценимое значение для работы над Impeller на Android и для того, чтобы в следующем релизе он стал инструментом рендеринга по умолчанию. Так как аппаратная экосистема Android очень разнообразна, в отзывах лучше подробно указать, на каком устройстве и версии Android возникли проблемы.
Улучшение производительности размытия (Blur performance improvements)
В релизе повторно реализовали Blur в Impeller для iOS и Android. В тестах новый подход, аналогичный Skia, сокращает время размытия процессора и графического процессора почти вдвое.
На диаграмме ниже показаны наихудшие, 99% и 90%, и средние показатели времени растеризации кадра. Там же можно увидеть время кадра графического процессора в мс на устройстве iPhone 11 в тесте на производительность размытия. После переписывания размытия Impeller (Impeller’s blur) затраты процессора и графического процессора на размытие фильтра фона сократились почти вдвое. Эти улучшения распространяются и на типовые приложения.
Юрий Петров, руководитель отдела разработки на Flutter
Flutter 3.22 радует новыми улучшениями. Vulkan для Android должен значительно улучшить плавность графики, а оптимизация эффектов размытия — сделать интерфейсы еще красивее. Будем пробовать и изучать.
Трафарет, потом обложка (Stencil-then-Cover)
Impeller на iOS и Android перешел на новую стратегию рендеринга, которая основана на подходе Stencil‑then‑Cover. Он описан в главе «Рисование заполненных вогнутых многоугольников с использованием буфера трафарета» («Drawing Filled, Concave Polygons Using the Stencil Buffer» ) в OpenGL Redbook. Подробнее эта техника применительно к Flutter обсуждается в выпуске GitHub № 123 671.
Подход решает проблему, когда растровый поток тратит слишком много времени на расчет тесселяций для сложных путей на ЦП, например, SVG и анимации Lottie. После изменения общее время расчета (поток пользовательского интерфейса на ЦП + поток растра на ЦП + работа графического процессора) значительно уменьшилось для кадров со сложными путями. Пользователи заметят, что анимация Lottie и другие сложные пути отображаются более плавно с меньшей загрузкой ЦП. А загрузка графического процессора вырастет незначительно.
Команда довольна этими улучшениями, но предстоит еще многое сделать. Генерация полилиний по-прежнему занимает видное место в профилях ЦП. Команда изучает возможность переноса этой работы и на графический процессор.
Юрий Петров, руководитель отдела разработки на Flutter
Переход на стратегию Stencil-then-Cover в Impeller выглядит очень убедительным. Стратегия улучшает производительность рендеринга сложных графических элементов. Она делает анимации и сложные пути более плавными и эффективными.
Новый API
Несмотря на экспериментальный характер теста на Flutter, теперь он принимает --enable-impeller.
Этот флаг проверяет Impeller с помощью серверной части Vulkan.
Фреймворк
Свойства состояния виджета
В новой версии переместили MaterialState за пределы библиотеки материалов и переименовали в WidgetState. Теперь он доступен для Cupertino, базовой платформы Flutter и авторов пакетов. Дополнительную информацию о переходе на новый WidgetState смотрите в руководстве по миграции.
Юрий Петров, руководитель отдела разработки на Flutter
В MaterialState реализовали полезную логику для обработки нескольких состояний. Теперь можно использовать функции MaterialState вне Material, например, в Cupertino, или в базовом слое виджетов. Несмотря на новое название, WidgetState, поведение двух классов одинаковое.
Динамический размер представления
Улучшения в динамическом изменении размера представления помогают разработчикам создавать адаптивные макеты. Они обеспечивают лучшую адаптируемость пользовательского интерфейса на разных экранах.
Юрий Петров, руководитель отдела разработки на Flutter
Важное обновление, так как раньше можно было получить ошибку округления при расчете ограничений экранного размера.
Улучшенная проверка формы
Благодаря вкладу члена сообщества Flutter ШарбелОкзана в релизе появились более гибкие методы проверки форм. Они позволяют разработчикам создавать более надежную обработку пользовательского ввода, повышают удобство использования и безопасность.
Коварианты в 2D-API
В релизе сократили необходимость приведения типов в API-интерфейсах 2D-графики, упростили рабочие процессы, повысили производительность. Это важно для игр и сложной анимации.
Юрий Петров, руководитель отдела разработки на Flutter
При использовании 2D-API во Flutter, таких, как Canvas и Paint, часто для некоторых операций приходилось преобразовывать типы данных. Коварианты позволяют API автоматически обрабатывать эти преобразования. Они делают разработку проще и быстрее.
Объединение активов по Flavors
Разработчики, которые используют функцию flavors, теперь могут настраивать отдельные ресурсы для объединения только при создании для конкретного варианта. Дополнительную информацию можно узнать в разделе «Условное объединение ресурсов на основе flavors».
Юрий Петров, руководитель отдела разработки на Flutter
Если у вас есть ресурсы, которые используются в вашем приложении только в определенном flavor, вы можете настроить их добавление в приложение только при создании этого flavor. Так размер пакета приложения не будет увеличиваться из-за неиспользуемых ресурсов.
Трансформация активов с помощью пакетов Dart
Теперь пользователи могут настраивать пакеты Dart для преобразования ресурсов своего приложения в том виде, в котором они находятся в комплекте. Дополнительную информацию можно получить в разделе «Преобразование активов во время сборки».
Юрий Петров, руководитель отдела разработки на Flutter
В Flutter теперь можно использовать пакеты Dart для преобразования ресурсов вашего приложения во время сборки. Это означает, что вы можете настраивать пакеты Dart так, чтобы они автоматически изменяли или обрабатывали ресурсы (например, изображения, файлы конфигураций и другие активы) до того, как они будут включены в вашу сборку.
Android
Глубокие ссылки
Глубокие ссылки улучшают взаимодействие с пользователем в приложении. Они действуют как ярлыки, которые плавно направляют пользователей к контенту в приложении. Благодаря глубоким ссылкам растут вовлеченность и продажи. Из соображений безопасности и удобства пользователей рекомендуется использовать Universal Links для iOS и App Links для Android. Но их настройка может быть сложной.
В последней стабильной версии Flutter появился инструмент проверки глубоких ссылок в DevTools. Он поддерживает проверку веб-конфигурации для приложений на Android. В этой версии добавили новый набор функций, который помогает проверять настройки в файлах манифеста Android.
Дополнительную информацию об использовании инструмента смотрите в разделе «Проверка глубоких ссылок».
Прогнозируемый жест назад
В Flutter 3.22 появилась дополнительная поддержка функции прогнозируемого возврата, которая скоро появится на Android. Благодаря этой функции пользователи смогут просматривать предыдущий маршрут или даже предыдущее приложение. На устройствах Android эта функция скрыта, но вы можете найти подробную информацию о том, как опробовать ее, на GitHub.
Flutter обеспечивает соблюдение требований к версии для Gradle, AGP, Java и Kotlin
В релизе 3.22 Flutter применяет политику в отношении поддерживаемых им версий для Gradle, плагина Android Gradle (AGP), Java и Kotlin. Сначала инструмент выдает только предупреждения.
Сейчас полностью поддерживаются диапазоны версий:
Gradle — начиная с 7.0.2 до текущей.
AGP — начиная с 7.0.0.
Java — текущая версия Java 11.
Kotlin — начиная с 1.5.0.
В следующем релизе предупреждения станут ошибками, которые можно будет переопределить с помощью --android-skip-build-dependency-validation. Инструмент выдает предупреждение, по крайней мере, для одного выпуска перед полным прекращением поддержки для версии этих зависимостей.
Эта политика обсуждалась в соответствующей спецификации проекта. Комментарии и отзывы всегда приветствуются.
Поддержка использования Gradle Kotlin DSL в сценариях сборки Gradle на Android
Gradle Kotlin DSL теперь поддерживается во Flutter как альтернатива традиционному Gradle Groovy DSL. С поддержкой редактировать код стало проще благодаря автозаполнению, быстрому доступу к документации, навигации по исходному коду и контекстно-зависимому рефакторингу.
Первоначальная поддержка была предоставлена пользователем GitHub bartekpacia. Теперь разработчики могут переписать сценарии сборки Gradle на Kotlin, хотя Flutter пока не позволяет выбирать Kotlin вместо Groovy при использовании flutter create.
Больше информации можно узнать на PR 140744 от bartekpacia
Юрий Петров, руководитель отдела разработки на Flutter
Интересное обновление, особенно для тех, кто знаком с языком Kotlin. Поддержка Gradle Kotlin DSL делает написание и поддержку сценариев сборки проще за счет более удобного инструмента.
Улучшения Platform views
Новости для тех, кто разрабатывает приложения на Flutter, которые используют собственные компоненты Android, например, карты, webview или определенные элементы пользовательского интерфейса!
Из-за ошибки в Android 14 приложения на более старых версий Flutter могут работать некорректно на устройствах с этой версией Android.
Flutter 3.22 устранил эту проблему и повысил общую производительность собственных компонентов в приложениях для Android. Чтобы обеспечить бесперебойную работу приложения на всех устройствах Android, пересоберите приложение с помощью Flutter 3.22.
Это обновление также включает в себя скрытые улучшения, которые делают platform views на Android в целом более надежными и производительными.
Прекращение поддержки KitKat
Минимальная поддерживаемая версия Android теперь — Lollipop (API 21). Начиная со стабильной версии 3.22, Flutter больше не будет работать на устройствах Android KitKat (API 19). Подробную информацию можно найти в руководстве по прекращению поддержки.
iOS
Производительности Platform view
Производительность Platform view на iOS была острой проблемой для многих разработчиков. Это было особенно заметно в views прокрутки при использовании.
Обновления обеспечивают улучшения в таких сценариях, как встраивание нескольких рекламных объявлений в статью. Ключевые улучшения в тесте:
Использование графического процессора снижается на 50%. Энергопотребление сократилось, пользовательский интерфейс стал более плавным.
Рендеринг кадров улучшился. Среднее время рендеринга кадров сократилось на 1,66 мс (33%).
Зависаний стало меньше. В худшем случае время рендеринга кадров сократилось на 3,8 мс (21%).
Если вы ранее сталкивались с проблемами производительности при использовании Platform view (например, рекламы и карт.) в представлениях с прокруткой, обновления обеспечат плавную и отзывчивую прокрутку. Пожалуйста, попробуйте и дайте обратную связь.
Экосистема
Предварительная версия Vertex AI для Firebase Dart SDK
Vertex AI для Firebase выпущен в общедоступной предварительной версии. Он включает Dart SDK. Теперь можно использовать Gemini API для создания генеративных функций искусственного интеллекта для приложения с учетом производительности, результативности и масштаба. SDK интегрирован с Firebase App Check, которая защищает вызовы API и серверную инфраструктуру от серьезных угроз, таких как мошенничество с выставлением счетов, фишинг и выдача себя за приложение. Ознакомьтесь с руководством по началу работы с Dart и начните использовать его бесплатно.
Обновления DevTools
DevTools — набор инструментов для повышения производительности и отладки для Dart и Flutter. В релизе появились улучшения производительности, общая доработка и новые функции: включение образцов ЦП на временную шкалу, расширенная фильтрация и поддержка импорта и экспорта снимков памяти.
Другие заметные улучшения были включены в пакеты devtools_extensions и devtools_app_shared. Появилась поддержка подключения расширения к новому Dart Tooling Daemon (DTD). Теперь расширения DevTools получают доступ к общедоступным методам, зарегистрированным другими клиентами DTD, например, IDE. Также DevTools получает доступ к минимальному API файловой системы для взаимодействия с проектом разработки.
Еще больше об обновлениях читайте в выпусках DevTools 2.32.0, 2.33.0 и 2.34.1.
Google Mobile Ads SDK для Flutter
Для тех, кто монетизирует приложения Flutter с помощью рекламы, Google Mobile Ads для Flutter выпустил крупное обновление до версии 5.0.1!
Расширенная поддержка SDK-платформы обмена сообщениями пользователей (UMP). Появилась поддержка новейших API из Android UMP SDK версии 2.2.0 и iOS UMP SDK версии 2.4.0. UMP SDK упрощает получение согласия от пользователя на персонализированную рекламу. В релизе представлено несколько новых API, которые сделают процесс получения согласия проще.
Расширенные партнеры-посредники. Появилась интеграция с популярными рекламными партнерами, такими как Unity, AppLovin и другие. Теперь можно увеличить доход от приложения благодаря расширенным возможностям в посредничестве и простой реализации.
Попробуйте новые функции и сообщите в поддержку, каких еще партнеров-посредников вы хотели бы видеть
Критические изменения и прекращение поддержки
ColorScheme.fromSeed
Если у seedColor
, который используется в ColorScheme.fromSeed
, высокое значение цвета (high chroma value), получившаяся цветовая схема может создавать палитры, которым не хватает яркости. Чтобы гарантировать, что получаемые цвета будут максимально соответствовать исходным, установите dynamicSchemeVariant
на DynamicSchemeVariant.fidelity
или DynamicSchemeVariant.content
. Эти опции генерируют палитры, которые лучше соответствуют исходному цвету.
Удаление встраивания Android v1
В данный момент происходит удаление первой версии встроенного Android. Это не повлияет на большинство приложений, потому что:
Вторая версия использовалась по умолчанию в течение многих лет.
Инструмент Flutter уже блокировал создание приложений первой версии, если только он не был специально переопределен с помощью -- ignore-deprecation.
В этом выпуске полностью прекращается поддержка инструментов Flutter для приложений v1. Переопределить инструмент Flutter больше невозможно.
Для авторов плагинов был написан документ по миграции. В рамках этой миграции авторам плагинов рекомендуется сохранить поддержку приложений, которые используют встроенную версии 1. Это можно сделать, включив в их Plugin.java метод a с сигнатурой
public static void registerWith(@NonNull io.flutter.plugin.common.PluginRegistry.Registrar registrar)
В следующем выпуске планируется полностью удалить встраивание Android v1. После этого плагины, которые включают метод с этой сигнатурой, больше не будут компилироваться.
В настоящее время это бесполезно, поскольку новый выпуске сломал приложения, которые используют встраивание v1. Авторам плагинов рекомендуется, как можно скорее выпускать обновленные версии своих плагинов с удаленным кодом v1. Это позволит избежать сбоев в будущих версиях Flutter. В качестве примера ознакомьтесь с PR 6494, который удалил плагины, поддерживаемые командой Flutter.
Устаревшие версии, которые были удалены в 3.22
Критические изменения в этом выпуске включают устаревшие API, срок действия которых истек после выпуска 3.19. Все затронутые API и дополнительные инструкции по контексту и миграции можно посмотреть в руководстве по прекращению поддержки для этого выпуска. Многие из них поддерживает Flutter fix, в том числе, быстрые исправления в IDE. Массовые исправления можно оценить и применить с помощью dart fix инструмента командной строки.
Как всегда, большое спасибо сообществу за участие в тестах — они помогают выявить критические изменения. Чтобы узнать больше, ознакомьтесь с политикой критических изменений Flutter.
Заключение
В основе успеха Flutter находитесь вы — наше удивительное сообщество. Этот релиз был бы невозможен без вашего бесчисленного вклада и непоколебимой страсти. От всей души благодарим вас.
Готовы изучить Flutter 3.22? Изучите полные примечания к выпуску и журнал изменений, запустите терминал и запустите flutter upgrade
.