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.pswp.cn/news/902707.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902707.shtml
英文地址,請注明出處:http://en.pswp.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包。 ?安裝驗證 雙擊…