
作者 / Chris Sells, Flutter 开发者体验产品经理
又到了北半球每年的这个时节: 树叶变黄、气温下降,而今年的最终稳定版本也在此时发布: Flutter 2.8 闪亮登场!这个版本凝聚了 207 位贡献者和 178 位审阅者的辛勤付出,合并了 2,424 个 PR,并解决了 2,976 个问题。在这里,我们要特别感谢此版本的杰出社区贡献者 Bartosz Selwesiuk,作为 Very Good Ventures 的 Flutter 工程师,他提供了 23 个 PR,其中大部分主要 "专注于" (原文如此) 面向 Web 的摄像头插件。
所有人的通力合作给引擎和 Flutter DevTools 带来了显著的性能改进、稳定的 Google Mobile Ads SDK for Flutter 版本、一系列全新的 Firebase 功能和改进、WebView 3.0、一批新的 Flutter Favorite package、朝着稳定版桌面端支持更进一步的大量更新,以及支持更多 package (包括 Firebase) 的新版本 DartPad。这应该是今年发布的最后一个版本,相信不负大家的期待。我们一起走进 Flutter 2.8!
性能
一如往常,Flutter 的第一要务是质量。我们的绝大部分工作旨在确保 Flutter 在其支持的设备上尽可能顺畅和稳健地运行。
启动
此版本对应用启动延迟进行了改进。我们通过 Google Pay 对这些改进进行了测试。作为一个热门的大型应用,Google Pay 拥有超过 100 万行代码,可以确保这些改进能够在现实环境中产生显著的积极影响。所有相关改进使 Google Pay 在低端 Android 设备上运行时的启动延迟降低了 50%,在高端设备上降低了 10%。
对于 Flutter 影响 Dart VM 垃圾回收策略机制的改进,现在有助于避免在应用启动序列中出现错误的垃圾回收 (GC) 周期。例如,在 Android 上渲染第一帧之前,Flutter 现在只通知 Dart VM "TRIM_LEVEL_RUNNING_CRITICAL" 及以上的内存压力。在本地测试中,此改进将低端设备上的第一帧时间减少了多达 300 毫秒。
#90551: 只通知 Dart VM "TRIM_LEVEL_RUNNING_CRITICAL" 及以上的内存压力
https://github.com/flutter/flutter/issues/90551
出于谨慎考虑,在之前的版本中,Flutter 在创建平台视图时会阻塞平台线程。经过仔细推敲和测试,我们确定可以移除一些序列化操作,这使得在低端设备上启动 Google Pay 时减少了超过 100 毫秒的阻塞。
#29145: 在 UI/Raster 线程上不要对 Shell::OnCreatePlatformView 进行序列化操作
https://github.com/flutter/engine/pull/29145#pullrequestreview-778935616
#91711: UI 线程上的 Shell::OnPlatformViewCreated 不应进行序列化
https://github.com/flutter/flutter/issues/91711
以前,设置默认字体管理器会在设置第一个 Dart Isolate 时引入人为延迟。延迟默认字体管理器设置,使其与 Dart Isolate 设置同时运行,既改善了启动延迟时间,又使得上述优化的效果更加明显,因为主要的瓶颈就在这里。
#29291: 延迟默认字体管理器,使其与 Isolate 设置同时运行
https://github.com/flutter/engine/pull/29291
内存
由于 Flutter 会急切地加载 Dart VM 的 "Service Isolate",其 AOT 代码与应用捆绑在一起,以便 Flutter 可以同时将两者读入内存,因此以内存受限设备为目标平台的 Flutter 开发者在进行性能跟踪时遇到了问题。对于使用 2.8 版本的 Android 设备,Dart VM 的 Service Isolate 会被分离到自己的软件包内,可单独加载,因此在需要使用 Service Isolate 之前,可以节省多达 40 MB 的内存。Dart VM 会通知操作系统,AOT 程序使用的内存分页被备份到了一个可能无需再次读取的文件里,这使得内存占用量进一步减少达 10%。因此,之前用于保存文件备份数据副本的分页可以被回收,并用于其他用途。
#91382: 引擎不应使用应用快照加载 VM 服务
https://github.com/flutter/flutter/issues/91382
#29245: 构建一个用于在 Android 分析模式启动 Service Isolate 的专用快照
https://github.com/flutter/engine/pull/29245
#92120: 为提供给 Dart VM 的类型映射提供提示
https://github.com/flutter/flutter/issues/92120
性能分析
有时,开发者希望能够同时查看来自 Flutter 的性能跟踪数据以及 Android 原生跟踪事件。此外,他们也会希望能查看以发布模式构建的应用中的跟踪事件,以便深入了解所部署的应用中的性能问题。为此,2.8 稳定版现在会将跟踪事件发送到 Android systrace 记录器 (如果其已在应用启动时启用),同时,即使 Flutter 应用在发布模式下构建,这些事件也会发送出来。

△ Flutter 跟踪事件现在显示在 Android systrace 记录工具中 (见底端)
#28903: 如在应用启动时启用 systrace,则使用 systrace 记录器,并在 Android 发布模式下启用 systrace
https://github.com/flutter/engine/pull/28903
此外,为了创建卡顿更少的动画,一些开发者希望性能跟踪记录中包含更多关于光栅缓存行为的信息,这使得 Flutter 能够对昂贵和重复使用的图片进行图块搬移,无需在每一帧上重新进行绘制。性能跟踪记录中的新流程事件现在允许开发者跟踪光栅缓存图片的生命周期。
#92286: 为光栅缓存的生成至删除事件添加流程或异步事件
https://github.com/flutter/flutter/issues/92286
Flutter DevTools
在调试性能问题方面,此版本的 DevTools 添加了新的 "增强跟踪 (Enhance Tracing)" 功能,以帮助用户诊断由成本高昂的构建、布局和绘制操作引起的界面卡顿。

#3451: 在性能页面增加跟踪绘制和跟踪布局开关
https://github.com/flutter/devtools/pull/3451
启用任一跟踪功能时,时间轴将根据选项相应地包含新的 "已构建 widget"、"已布局渲染对象" 和 "已绘制渲染对象" 事件。

另外,此版本的 DevTools 添加了新功能来分析应用启动时的性能表现。此剖析文件包含从 Dart VM 初始化到第一个 Flutter 帧渲染完成的所有 CPU 采样。在点击 "剖析应用启动 (Profile app starup)" 按钮并加载应用启动剖析文件后,您将看到剖析文件的 "AppStartUp" 用户标签已被选中。您还可以通过在列表中选择这个用户标签过滤器 (如果可用),来加载应用启动剖析文件。选择此标签会显示您应用启动的剖析数据。

#3357: 增加应用启动剖析功能,以及改进 CPU 剖析缓存
https://github.com/flutter/devtools/pull/3357
Web 版平台视图
并不是仅有 Android 和 iOS 平台的性能得到了改进,此版本还改进了 Web 版 Flutter 平台视图的性能。如果您不熟悉平台视图,这里简单介绍一下: 它是 Flutter 供您托管来自应用底层平台的原生界面组件的方式。Web 版 Flutter 使用 HtmlElementView widget 实现这一功能,用于在 Flutter web 应用中托管 HTML 元素。如果您正在使用 google_maps_flutter 或 video_player 插件的 Web 版本,或者您正在遵循 Flutter 团队关于如何在 Web 平台优化显示图像的建议,那么您就是在使用平台视图。
HtmlElementView
https://api.flutter.cn/flutter/widgets/HtmlElementView-class.html
在 Web 中展示图片
https://flutter.cn/docs/development/platform-integration/web-images#use-img-in-a-platform-view
在 Flutter 之前的版本中,嵌入平台视图会立即构建一个新的 canvas,每增加一个平台视图,都会添加一个新的 canvas。这些额外生成的 canvas 成本高昂,因为每个 canvas 都是整个窗口的大小。而在新版本中,我们复用了为之前的平台视图创建的 canvas,因此相比较之前每秒承担 60 倍的成本,如今在整个应用的生命周期内只需要承担一次成本即可。这意味着您可以在 Web 应用中创建多个 HtmlElementView 而不损失性能,同时可减少使用平台视图时的滚动卡顿。
#28087: 优化特殊用例下的 CanvasKit 平台视图
https://github.com/flutter/engine/pull/28087
生态系统
Flutter 不仅仅是框架、引擎和工具: pub.dev 上有超过 20,000 个与 Flutter 兼容的 package 和插件,而且每天还在不断产生更多的内容。Flutter 开发者日常大量互动的内容构成了一个更为庞大的生态系统,让我们一起来看看自上个版本以来 Flutter 生态系统的发展吧。
Flutter Ads 正式发布
首先,也是最重要的是,Google Mobile Ads SDK for Flutter 已正式发布。

此版本支持 5 种广告格式,集成了 AdMob 和 Ad Manager 支持,并包含新中介功能的测试版,可帮助您优化广告效果。有关将 Google Ads 集成到 Flutter 应用以及其他获利方案的更多信息,请查看有关获利的详细信息:
https://flutter.cn/monetization
WebView 3.0
这次 Flutter 还带来了 webview_flutter 插件的 3.0 版本:

Flutter 2.8版本带来了显著的性能改进,包括应用启动延迟降低、内存管理优化,以及Web平台视图性能增强。此外,此版本还正式发布了Google Mobile Ads SDK for Flutter,改进了WebView功能,并引入了新的Firebase集成方式。Flutter DevTools添加了增强跟踪功能和应用启动性能分析。生态系统的扩展包括Flutter Favorite packages的更新和桌面端支持的进一步发展。
最低0.47元/天 解锁文章
354

被折叠的 条评论
为什么被折叠?



