Flutter 在全新 Platform 和 UI 线程合并后,出现了什么大坑和变化?

Flutter 在全新 Platform 和 UI 线程合并后,出现了什么大坑和变化?

在两个月前,我们就聊过 3.29 上《Platform 和 UI 线程合并》的具体原因和实现方式,而事实上 Platform 和 UI 线程合并,确实为后续原生语言和 Dart 的直接同步调用打了一个良好基础,在《Flutter Roadmap 2025》 里官方也提到了:

直接从 Dart 调用 Objective C 和 Swift 代码(适用于 iOS)以及 Java 和 Kotlin(适用于 Android),2025 这种同步调用方式也许可以在 Framework 和 Plugin 层面大规模引入。

没有 MethodChannel 确实是好事,但是凡事皆有利弊,线程合并随着也带来了它的一些负面问题,首先最直观的就是,在 Android 断点开发时,断点 Dart 代码现在会导致 ANR 弹框:

其实这可以理解,因为现在 Dart 和平台主线程绑定在一起了,断点导致的无响应而出现 ANR 很合理,如果比较介意,而目前解决的办法也很简单,就是暂时关了线程合并,你可以选择的 Debug 的 AndroidManifest 关闭线程合并:

        <meta-dataandroid:name="io.flutter.embedding.android.DisableMergedPlatformUIThread"android:value="true" />

那如果说上面这只是小问题,那么下面这个可以说是比较关键的问题了。

在 #163064 里,因为线程合并之后,启动引擎、应用和设置 Dart 代码都运行的平台线程上,会导致第一个可交互帧的时间变长,并且还看具体场景:

特别是,当平台线程在 Android (例如 Android Activity 的布局)和 Dart 执行工作之间分配时,就可能会有更多的延迟。

这其实也是可预见的情况,在合并线程这个 feature 提出来时,就有人担忧类似问题,而解决办法也很“简单”,那就是启动的时候多加一个启动线程:

所以,一个新功能修复了老 Bug,但是总会带来好几个新的 Bug ,所以两 issue 生四翔,四翔生 Bug 挂。

目前 #166918 这个 PR 已经成功合并,该 PR 将原本的简单 bool 合并线程启用状态修改为三种线程状态,其中就有全新的 kMergeAfterLaunch :

kMergeAfterLaunch 模式下,Engine 会在单独的 Dart UI 线程上启动引擎,然后在引擎初始化后会将 UI 任务移至平台线程合并,从而改善应用启动延迟的问题。

简单说,就是启动时还是走老的 Dart UI 线程,启动完成之后再合并到一起。

在启动之前,引擎通过设置让 root isolate 关联到原本的 UI Runner ,从而实现单独的启动线程:

而在启动之后,Dart 的主线程就会移动到平台线程,虽然说是“移动线程”,但是通过上面的代码我们可以看到,实际上就是将两个任务队列 Merge 合并成一个,也就是原本分别在两个任务队列中排队的任务,启动成功后会被放入同一个队列中,并由同一个线程来执行。

我们之前就讲过,UI Runner 都是通过独立的 MessageLoopTaskQueues 来处理任务,而 MessageLoopTaskQueues 又是 Flutter Engine 内部用于管理任务队列的类,它负责创建、维护和调度任务队列。

因为 Flutter Engine 不会直接控制线程的创建和销毁,而是通过控制任务队列的调度来间接影响线程的行为,通过合并任务队列,Engine 就可以让多个线程执行的任务集中到一个线程上,从而达到合并线程的作用。

而对应的还有 Unmerge 操作,Unmerge 会将之前合并的任务队列重新分离成两个独立的队列,这样在 Engine 需要关闭或者销毁的时候,就可以将合并的线程恢复到原始状态。

另外,目前在 kMergeAfterLaunch 模式下,禁止生成共享相同任务运行器的引擎,因为在线程合并后,生成新的引擎可能会导致死锁:

所以可以看到,增加启动线程的核心就是用原本的 Dart UI 线程进行启动,然后启动完成把任务队列合并到平台线程,回归平台线程的逻辑。

当然,说起来简单,事实上这个修改在 Engine 涉及了 36 个文件,所以会不会改出什么新的 bug,暂时不好评价:

另外,目前 maoOS 的线程合并也已经完成,所以下个版本开始 macOS 上也是统一的平台线程支持了,有了这个,似乎在 macOS 上使用 FFI 制作自己的图形 API 也不是不可能:

最后,顺带一提,Flutter 官方正式启动了 Widget 预览的开发推进,只是从我的角度,总觉得这个没太大必要,毕竟感觉就算出来了也不会很好用:

所以,你在 Flutter 3.29 上还有遇到过什么线程合并带来的问题吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/902707.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯 1. 四平方和

四平方和 原题目链接 题目描述 四平方和定理&#xff08;又称拉格朗日定理&#xff09;指出&#xff1a; 每个正整数都可以表示为 至多 4 个正整数的平方和。 如果将 0 包括进去&#xff0c;则每个正整数都可以恰好表示为 4 个非负整数的平方和。 例如&#xff1a; 5 0 …

开发并发布一个属于自己的包(npm)

一、CommonJS规范导入require 创建一个npm包涉及几个步骤&#xff0c;包括设置你的项目结构、编写代码、编写文档、测试你的代码&#xff0c;以及发布到npm仓库。以下是一个基本的指南&#xff0c;帮助你从头开始创建一个npm包。 步骤 1: 初始化npm项目 创建项目文件夹&#x…

CRTP(Curiously Recurring Template Pattern)

C 中的 CRTP&#xff08;奇异递归模板模式&#xff09; CRTP&#xff08;Curiously Recurring Template Pattern&#xff09;是一种利用模板继承实现 静态多态&#xff08;Static Polymorphism&#xff09; 的设计模式。通过基类模板以派生类作为模板参数&#xff0c;CRTP 允许…

小白工具视频转MPG, 功能丰富齐全,无需下载软件,在线使用,超实用

在视频格式转换需求日益多样的今天&#xff0c;小白工具网的在线视频转 MPG 功能https://www.xiaobaitool.net/videos/convert-to-mpg/ &#xff09;脱颖而出&#xff0c;凭借其出色特性&#xff0c;成为众多用户处理视频格式转换的优质选择。 从格式兼容性来看&#xff0c;它支…

银河麒麟系统离线安装nodejs

本篇文章我们介绍如何通过nvm(node版本管理工具)来实现离线安装nodejs 第一步&#xff1a;下载nvm https://github.com/nvm-sh/nvm/releases/tag/v0.40.1 在页面找到【Source code(tar.gz)】下载 第二步&#xff1a;安装nvm 将下载好的tar.gz拷贝到银河麒麟系统文件夹下(加…

Go语言中包导入下划线的作用解析

在Go语言的代码中&#xff0c;有时会看到类似以下的导入语句&#xff1a; import _ "github.com/mattn/go-sqlite3"这种以下划线_开头的导入方式&#xff0c;显得有些特别&#xff0c;尤其是对于新手来说&#xff0c;可能会感到困惑&#xff0c;为什么要这样写&…

Winddows11官网下载安装VMware Workstation Pro17(图文详解)

Winddows11安装VMware17 1、官网下载2、安装3、总结 1、官网下载 官网地址 点击Products&#xff0c;滑到最下面&#xff0c;选择SEE DESKTOPP HYPERVISORS 选择 DOWNLOAD FUSION OR WORKSTATION 自动跳转到下面哪个服界面&#xff0c;注册 输入邮箱地址和图片下面的文字…

DeepSeek智能时空数据分析(二):3秒对话式搞定“等时圈”绘制

序言&#xff1a;时空数据分析很有用&#xff0c;但是GIS/时空数据库技术门槛太高 时空数据分析在优化业务运营中至关重要&#xff0c;然而&#xff0c;三大挑战仍制约其发展&#xff1a;技术门槛高&#xff0c;需融合GIS理论、SQL开发与时空数据库等多领域知识&#xff1b;空…

【Linux网络】应用层自定义协议与序列化及Socket模拟封装

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…

基于大模型的结肠癌全病程预测与诊疗方案研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、结肠癌概述 2.1 流行病学特征 2.2 发病机制与危险因素 2.3 临床症状与诊断方法 三、大模型技术原理与应用现状 3.1 大模型的基本原理 3.2 在医疗领域的应用情况 3.3 在结肠癌预测中的潜力分析 四、术前…

【UML建模】starUML工具

一.概述 StarUML是一款UML工具&#xff0c;允许用户创建和管理UML&#xff08;统一建模语言&#xff09;模型&#xff0c;广泛应用于软件工程领域。它的主要功能包括创建各种UML图&#xff1a;如用例图、类图、序列图等&#xff0c;支持代码生成与反向工程&#xff0c;以及提供…

模板元编程(Template Metaprogramming, TMP)

C 模板元编程&#xff08;Template Metaprogramming, TMP&#xff09; 模板元编程是一种利用 C 模板系统在 编译期间 完成计算、类型操作和代码生成的编程范式。其核心优势在于通过 零运行时开销 实现高效、类型安全的代码。以下是模板元编程的详细分步解析。 1. 编译时计算 …

Android Build Variants(构建变体)详解

Android Build Variants&#xff08;构建变体&#xff09;是 Android 开发中用于生成不同版本应用程序的一种机制。它允许开发者根据不同的需求&#xff0c;如不同的应用市场、不同的功能模块、不同的环境配置等&#xff0c;从同一个代码库中生成多个不同的 APK。 组成部分 B…

26考研|数学分析:数项级数

数项级数这一章的开始&#xff0c;开启了新的关于“级数”这一新的概念体系的学习进程&#xff0c;此部分共包含四章的内容&#xff0c;分别为数项级数、函数项级数、幂级数以及傅里叶级数。这一章中&#xff0c;首先要掌握级数的相关概念与定义&#xff0c;重难点在于掌握判断…

拥抱健康生活,解锁养生之道

在生活节奏日益加快的当下&#xff0c;健康养生已成为人们关注的焦点。科学的养生方法&#xff0c;能帮助我们增强体质、预防疾病&#xff0c;以更饱满的精神状态拥抱生活。 合理饮食是养生的基石。《黄帝内经》中提到 “五谷为养&#xff0c;五果为助&#xff0c;五畜为益&…

房地产安装工程师简历模板

模板信息 简历范文名称&#xff1a;房地产安装工程师简历模板&#xff0c;所属行业&#xff1a;其他 | 职位&#xff0c;模板编号&#xff1a;XUCP9X 专业的个人简历模板&#xff0c;逻辑清晰&#xff0c;排版简洁美观&#xff0c;让你的个人简历显得更专业&#xff0c;找到好…

HTML5 详细学习笔记

1. HTML5 简介 HTML5 是最新的 HTML 标准&#xff0c;于 2014 年 10 月由 W3C 完成标准制定。它增加了许多新特性&#xff0c;包括语义化标签、多媒体支持、图形效果、离线存储等。 1.1 HTML5 文档基本结构 <!DOCTYPE html> <html lang"zh-CN"> <h…

【网络入侵检测】基于Suricata源码分析NFQ IPS模式实现

【作者主页】只道当时是寻常 【专栏介绍】Suricata入侵检测。专注网络、主机安全,欢迎关注与评论。 1. 概要 👋 本文聚焦于 Suricata 7.0.10 版本源码,深入剖析其 NFQ(Netfilter Queue)模式的实现原理。通过系统性拆解初始化阶段的配置流程、数据包监听机制的构建逻辑,以…

C语言结构体和union内存对齐

在C语言的世界里&#xff0c;结构体&#xff08;struct&#xff09;和联合体&#xff08;union&#xff09;的内存布局一直是困扰许多开发者的难题。当我们定义一个结构体时&#xff0c;编译器会按照特定的规则为每个成员分配内存空间&#xff0c;这些规则被称为内存对齐。看似…

本地部署DeepSeek-R1模型接入PyCharm

以下是DeepSeek-R1本地部署及接入PyCharm的详细步骤指南,整合了视频内容及官方文档核心要点: 一、本地部署DeepSeek-R1模型 1. 安装Ollama框架 ​下载安装包 访问Ollama官网(https://ollama.com/download)Windows用户选择.exe文件,macOS用户选择.dmg包。 ​安装验证 双击…