Flutter熱更新技術探索

来源:https://www.cnblogs.com/Jcloud/archive/2023/05/26/17433902.html
-Advertisement-
Play Games

APP發佈到市場後,難免會遇到嚴重的BUG阻礙用戶使用,因此有在不發佈新版本APP的情況下使用熱更新技術立即修複BUG需求。原生APP(例如:Android & IOS)的熱更新需求已經比較成熟,但Flutter技術棧目前還缺少類似的技術方案,因此Flutter研發團隊,也需要類似的熱更新技術。 ...


一,需求背景:

APP發佈到市場後,難免會遇到嚴重的BUG阻礙用戶使用,因此有在不發佈新版本APP的情況下使用熱更新技術立即修複BUG需求。原生APP(例如:Android & IOS)的熱更新需求已經比較成熟,但Flutter技術棧目前還缺少類似的技術方案,因此Flutter研發團隊,也需要類似的熱更新技術。

二,Flutter熱更新技術方向分析:

經過分析目前可能有三種可行的方案: 1)類似RN框架; 2)頁面動態組件框架; 3)Dart虛擬機定製方案;

方案名稱 原理 優點 缺點 開源方案
類似RN的方案 用JS以Flutter語法寫dart,然後用JavaScript把XML DSL轉為Flutter的原子widget組件,然後再讓Flutter來渲染 由於ios系統內置支持js,ios上完全可以實現更新 1)由於跨語言執行,對於性能有影響;學習成本高 2)Android 端需要額外引入JS庫 手Q的MXFlutter,58同城的Fair
頁面動態組件方案 編譯期時插樁/預埋好DynamicWidget到代碼中,然後動態下發Json 數據,通過協定好的語義匹配到JSON內的數據,動態替換Widget內容來實現更新 能支持Android/iOS 兩端的更新 1)UI更新相對較容易,業務邏輯動態化較麻煩; 2)語義解析器開發成本相對較大,且不易維護 3)需要一整套前後端服務和工具 天貓的Tangram,淘寶的DinamicX等
Dart虛擬機定製方案 通過分析Dart虛擬機的原理,修改Flutter Engine層Java/C++代碼實現熱更新的目標; 性能影響小,動態性很高,技術上可以替換所有Flutter頁面(包括UI,邏輯,資源文件) 由於使用的是定製引擎,需要維護不同版本的Flutter引擎代碼; 未開源

因為其他方式都有開源的示例,本案將重點以第三種“Dart虛擬機定製方案”為目標,做方案的研究講解。

三,預備知識

在開始瞭解技術方案之前,需要提前瞭解一些相應的技術概念:

3.1 Flutter編譯模式

Flutter開發語言是Dart,它的編譯模式來自Dart的編譯模式,主要有JIT(Just In Time)和AOT(Ahead Of Time)。

編譯模式名稱 特點 優點 缺點
JIT 即時編譯,典型例子V8,它可以即時編譯運行JS,只需要輸入源代碼字元串,就可以編譯運行代碼 可以動態下發和執行代碼,不用管CPU架構,可以提供動態化內容 1,大量字元串代碼讓JIT編譯器花費時間和記憶體; 2,性能不好;
AOT 預先編譯,典型例子C/C++,通過GCC編譯成二進位代碼,然後安裝取得許可權後才可以載入執行 事先編譯好的,載入和執行速度快 1,編譯時區分CPU架構; 2,生成的二進位代碼包比較大; 3,二進位代碼需要取得許可權才可以執行,無法在ios系統上動態更新

Flutter編譯模式有:Debug,Release,Profile;

Flutter編譯模式 特點
Debug 對應JIT模式,支持設備和模擬器; 打開了斷言,支持快速開發,支持HotReload; 並未對包大小,執行速度做優化;
Release 對應AOT模式,支持真機,不支持模擬器; 禁止了所有斷言調試信息; 對包大小,啟動和執行速度進行了優化;
Profile 類似Release模式,保留了一些調試功能,幫助性能分析;

3.2 Flutter編譯產物分析

Flutter下的iOS/Android工程本質上是一個標準的iOS/Android的工程;IOS平臺: Flutter通過在BuildPhase中添加shell(xcode_backend.sh)來生成和嵌入App.framework和Flutter.framework到ios; Android平臺: Flutter通過gradle來添加flutter.jar和編譯完的二進位文件添加到Android;

3.2.1 引擎層結構分析:

3.2.2 Android編譯產物的分析

3.2.3 IOS編譯產物的分析

四,熱更新技術方案分析

4.1 業務代碼分析

根據“3.3.1” ~“3.3.2”的分析可以確定無論是IOS還是Android APP業務代碼都是由四個段組成:kDartVmSnapshotData、kDartVmSnapshotInstructions、kDartIsolateSnapshotData、kDartIsolateSnapshotInstructions;理論上只要能動態替換載入的代碼段&數據段代碼即可實現目標。

名稱 註釋 作用 註釋
kDartIsolateSnapshotData Dart isolate數據段 類信息,全局變數,函數指針等 允許動態下發
kDartIsolateSnapshotInstructions Dart isolate指令段 包含由Dart isolate執行的AOT代碼 IOS不允許動態下發
kDartVmSnapshotData vm isolate數據段 isolate 之間共用的 Dart 堆 (heap) 的初始狀態 允許動態下發
kDartVmSnapshotInstructions vm isolate指令段 包含 VM 中所有 Dart isolate 之間共用的通用程式的 AOT 指令 IOS不允許動態下發

註釋: isolate, snapshot, vm isolate含義解釋如下:

名稱 含義
isolate Dart是單線程,isolate跟線程差不多,可以理解為 Dart 中的線程。 isolate 與線程的區別:線程與線程之間是共用記憶體的,而 isolate 和 isolate 之間是記憶體不共用的。 不存在鎖競爭問題,兩個Isolate完全是兩條獨立的執行線,且每個Isolate都有自己的事件迴圈,它們之間只能通過發送消息通信,所以它的資源開銷低於線程。
snapshot 將類信息、全局變數、函數指令直接以序列化的方式存在磁碟中,稱為 Snapshot(快照)。
vm isolate 同一個進程里可以有很多isolate,但兩個 isolate 的堆區是不能共用的,所以官方設計了 VM isolate,也就是 kDartVmSnapshot,用來多個 isolate 之間的交互。

4.2 業務代碼的載入分析(運行時)

按照4.1的分析思路,我們首先需要瞭解Flutter運行時代碼載入的完整流程,經過梳理分析流程如下:

1 )Android- APP業務代碼的載入流程:

2)IOS- APP業務代碼的載入流程:

4.3 業務代碼的編譯生成(編譯時)

根據以上的分析,我們知道了Flutter業務代碼的數據結構,也知道了在運行時如何載入,因此我們只需要在編譯時做更改,產生自己需要的代碼段,和數據段文件。在運行時載入自己的構建產物即可達到目標。

1)在此以 IOS 構建自己的業務代碼流程做詳細分析:

**有完成構建流程可以分析,基本流程是“Dart Code(業務代碼)” -> (通過Dart編譯器gen_snapshot.cc) 生成 snapshot_assemble.S 的彙編文件 -> (通過xcrun工具)生成 snapshot_assemble.o的obj文件 -> (通過xcun clang工具鏈) 生成了 App.Framework。

2)Android的產物構建流程和IOS類似。由於Android有其他更簡單的方案, 因此省略詳細的構建流程分析,大致如下:

4.4 實現熱更新的方案探索

根據上面的技術分析結果,已經可以獨立生成自己的代碼段,數據段文件。通過需改虛擬機底層代碼的方式,也可以動態的載入運行。但由於IOS系統目前底層的系統還不能動態載入可讀寫的代碼段數據到記憶體中,所以還有技術難點需要突破。但Android端有更簡單的路徑可以解決,因此下麵以Android端為例重點分析思路,大致如下圖所示:

由上圖可以得知,Android端 熱修複核心步驟如下:

1, 修改Flutter Engine代碼,載入指定路徑的libapp.so和flutter_aasets,比如私有目錄(data/data/files);

2, 編譯APK時,利用Gradle Transform插件,根據Flutter SDK的engine version動態替換官方的Flutter engine,最終寫入修改後的engine到APK;

3, 生成補丁包:利用BSdiff演算法比較新舊APK文件,生成patch補丁包

4, APP啟動時訪問後端介面,根據參數(app的版本號,補丁包版本號,md5,flutter SDK版本號,Engine版本號)拉取補丁包;

5, 合成補丁包:校驗md5,app版本號,補丁版本號,安裝時間;

6, 自定義Flutter Engine載入指定路徑的libapp.so和flutter_assets資源文件;

作者:京東科技 劉振中、周智

內容來源:京東雲開發者社區


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 中醫古文字經過千年的演變,字的本義與現在的含義已相去甚遠,中醫專業的學生或中醫愛好者研習傳統醫學經典,必需有一個方便易用的字典工具,《近萬條中醫名詞術語大全ACCESS資料庫》就能幫你實現。欄位信息、每個欄位的內容信息、記錄數信息等都請觀看截圖。 本資料庫是由 Microsoft Access 20 ...
  • 摘要:本文將聚焦於用戶監控的原理及應用進行介紹。 本文分享自華為雲社區《GaussDB(DWS)監控工具指南(二)用戶級監控》,作者:幕後小黑爪 。 前言 資源監控是整個運維乃至整個產品生命周期重要的一環,事前及時語句發現故障,事後提供詳實的數據用於追查定位問題。GaussDB(DWS)整個資源監控 ...
  • 近萬條一級分類經典簡訊大全ACCESS資料庫收集的是近萬條常用經典簡訊,之所以稱“一級分類”(意思是只有一個大類沒有子類),原因是為了區別另外一個有二級分類的簡訊資料庫。近萬條一級分類經典簡訊大全ACCESS資料庫中的簡訊都是經過索引沒有收錄重覆的記錄。 大類分類情況是:愛情簡訊(1730)、搞笑短 ...
  • 《5284個中醫葯基本名詞中醫名詞ACCESS資料庫》共收集中醫葯基本名詞5284個,分類情況統計:01.總論(45)、02.醫史文獻(275)、03.中醫基礎理論(804)、04.診斷學(930)、05.治療學(399)、06.中藥學(640)、07.方劑學(560)、08.針灸學(708)、09 ...
  • 摘要:本文模擬一下在主庫查詢訂單信息查詢不到的時候,切換數據源去歷史庫裡面查詢。 本文分享自華為雲社區《springboot動態切換數據源》,作者:小陳沒煩惱 。 前言 在公司的系統里,由於數據量較大,所以配置了多個數據源,它會根據用戶所在的地區去查詢那一個資料庫,這樣就產生了動態切換數據源的場景。 ...
  • 準備測試表,先跟著執行下麵的SQL ```sql #1.登錄MySQL後 #2.創建test_database資料庫,不存在則創建 create database if not exists test_database; #2.1.如果test_database庫存在,可以根據自己意願刪除或換個名稱 ...
  • 這是從一個完整的茶文化網站採集下來的完整的內容,2萬多條的記錄數幾乎包含了關於茶信息的所有內容,而且內容格式經過嚴謹的整理不會顯示亂七八遭而是統一干爽的格式。憑此資料庫可以創建一個內容建全的茶網站。 模塊包含:茶的種類(497)、茶具知識(139)、茶農資料(1568)、茶葉技術(3437)、茶藝茶 ...
  • 關於菜譜類的數據這個博客里已經發現過幾次,但是關於數據量多一點的飲食方面的數據似乎沒有見過,即使有也是千把條數據,而今天採集的就是一個關於飲食方面網站的大量數據。 分類是根據模塊來區分的所以類別不是很多,詳細情況是:廚房寶典(969)、美食笑話(175)、新鮮食報(5770)、飲食文化(980)、營 ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...