<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Flutter熱更新技術探索

OSC開源社區 ? 來源:OSCHINA 社區 ? 作者:OSCHINA 社區 ? 2023-06-08 14:31 ? 次閱讀

來源 | OSCHINA 社區

作者 | 京東云開發者-京東科技 劉振中、周智

一,需求背景:

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 引擎層結構分析:

wKgZomSBddWAEPUGAAQyS4gZMvY347.png

3.2.2 Android 編譯產物的分析

wKgZomSBddWACiu-AAVumPsgbBI104.png

wKgZomSBddWACKZjAAEXsqUqD-A843.png

3.2.3 IOS 編譯產物的分析

wKgaomSBddWARwvFAAKTsac9WYc301.png

wKgZomSBddWABNDMAADBJNnqYMo447.png

四,熱更新技術方案分析

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 之間的交互。

wKgaomSBddWALgYLAAKZnj4d3V0393.png

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

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

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

wKgaomSBddWAI99fAAGJbkA3lbI723.png

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

wKgaomSBddWAagZ7AAOsazD2e9U838.png

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

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

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

wKgZomSBddWAGiKNAASum8t4Xiw488.png

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

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

wKgZomSBddWAeA-fAAB_PMDOBqY908.png

4.4 實現熱更新的方案探索

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

wKgaomSBddaANHNfAAF3EAyPXcA741.png

由上圖可以得知,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 資源文件;

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Android
    +關注

    關注

    12

    文章

    3880

    瀏覽量

    125905
  • 開源
    +關注

    關注

    3

    文章

    3026

    瀏覽量

    41774
  • iOS
    iOS
    +關注

    關注

    8

    文章

    3348

    瀏覽量

    149320
  • BUG
    BUG
    +關注

    關注

    0

    文章

    154

    瀏覽量

    15601
  • flutter
    +關注

    關注

    0

    文章

    12

    瀏覽量

    404

原文標題:Flutter熱更新技術探索

文章出處:【微信號:OSC開源社區,微信公眾號:OSC開源社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    2015 Cadence新技術研討會

    2015 Cadence新技術研討會Cadence一致探索并研發EDA新技術,以加速設計并提高我們設計品質!2015 Cadence 新產品成員(OLB,OPE,EDM)如何助推我們的設計效率、全新
    發表于 05-19 10:19

    深入理解flutter的編譯原理與優化

    差別,關系如何,又是如何嵌入Android/iOS的呢?Flutter的渲染和事件傳遞機制如何工作?Flutter支持更新嗎?Flutter
    發表于 07-02 17:47

    電源突破性的新技術

    在半導體技術中,與數字技術隨著摩爾定律延續神奇般快速更新迭代不同,模擬技術的進步顯得緩慢,其中電源半導體技術尤其波瀾不驚,在十年前開關電源就
    發表于 07-16 06:06

    Flutter框架相關資料下載

    作者: Flutter 團隊I/O 期間我們迎來 Flutter 框架的一個重要里程碑,因為我們的開發重點從移動平臺擴展到了更廣泛的設備和機型。在 I/O 大會上,我們發...
    發表于 12-16 08:06

    臺積電又在探索哪些新技術?

    未來IC技術發展的道路不再是一條直線。開箱即用的解決方案的需求將迎來創新的黃金時代。未來的電子系統將需要計算架構以及設備和封裝技術的共同創新。那么,全球晶圓代工龍頭臺積電為了將代工這活兒做到極致,又在探索哪些
    的頭像 發表于 05-17 11:14 ?3320次閱讀
    臺積電又在<b class='flag-5'>探索</b>哪些<b class='flag-5'>新技術</b>?

    Flutter 3現已推出,能穩定支持macOS和Linux

    ,繼 Windows 之后,Flutter 現已穩定支持 macOS 和 Linux! 我們總計合并了 5,248 條 PR,感謝各位 Flutter 貢獻者的辛勤工作! 此版本中激動人心的升級包括: 更新
    的頭像 發表于 05-24 17:48 ?2140次閱讀

    關于Google Flutter 3更新內容

    又到了 Flutter 穩定版發布時間,我們無比自豪地宣布推出 Flutter 3!僅 3 個月前,我們宣布了 Flutter 對 Windows 的支持?,F在,我們再次懷著激動的心情宣布,繼 Windows 之后,
    的頭像 發表于 06-22 16:13 ?944次閱讀

    Flutter Go Flutter學習App

    ./oschina_soft/flutter-go.zip
    發表于 06-23 09:21 ?0次下載
    <b class='flag-5'>Flutter</b> Go <b class='flag-5'>Flutter</b>學習App

    Flutter Forward 活動即將到來!

    Flutter 的全球盛會 Flutter Forward 將于 2023 年 1 月 25 日在肯尼亞內羅畢舉行。諸多 Flutter更新內容不容錯過,期待與您 線上 見面。 活
    的頭像 發表于 12-22 23:05 ?894次閱讀

    Flutter Forward 活動即將到來!

    Flutter 的全球盛會 Flutter Forward 將于 2023 年 1 月 25 日在肯尼亞內羅畢舉行。諸多 Flutter更新內容不容錯過,期待與您 線上 見面。 活
    的頭像 發表于 12-23 11:55 ?971次閱讀

    Flutter 共創未來 | Flutter Forward 活動精彩回顧

    Flutter 的愿景。Flutter Forward 是在肯尼亞內羅畢以線上直播方式舉行的開發者活動,世界各地的開發者能夠親自參與或者遠程相聚,探索 Flutter 的未來發展方
    的頭像 發表于 02-22 23:20 ?419次閱讀

    社區說 | 精益求精: Flutter 技巧專題篇

    Flutter 作為深受歡迎的跨平臺開發框架,迄今為止已有超過 70 萬款使用 Flutter 打造的應用上架。開源生態社區更是有超過 20% 的中國開發者作出貢獻。 本次 Flutter 專題
    的頭像 發表于 07-25 17:45 ?315次閱讀
    社區說 | 精益求精: <b class='flag-5'>Flutter</b> 技巧專題篇

    Flutter圖片是如何加載的?使用過程中有哪些需要注意的地方?

    隨著Flutter穩定版本逐步迭代更新,京東APP內部的Flutter業務也日益增多,Flutter開發為我們提供了高效的開發環境
    的頭像 發表于 08-18 10:06 ?670次閱讀
    <b class='flag-5'>Flutter</b>圖片是如何加載的?使用過程中有哪些需要注意的地方?

    了解 Flutter 3.16 功能更新

    作者 / Kevin Chisholm 我們在季度 Flutter 穩定版發布會上帶來了 Flutter 3.16,此版本包含諸多更新:?Material 3 成為新的默認主題、為 Android
    的頭像 發表于 12-16 15:55 ?466次閱讀
    了解 <b class='flag-5'>Flutter</b> 3.16 功能<b class='flag-5'>更新</b>

    淺談兼容 OpenHarmony 的 Flutter

    OpenHarmony SIG 組織在 Gitee 開源了兼容 OpenHarmony 的 Flutter。該組織主要用于孵化 OpenHarmony 相關的開源生態項目。 ? ? ▲ 倉庫地址
    的頭像 發表于 02-02 15:22 ?304次閱讀
    淺談兼容 OpenHarmony 的 <b class='flag-5'>Flutter</b>
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>