主頁 > 移動端開發 > Flutter熱更新技術探索

Flutter熱更新技術探索

2023-05-26 15:05:50 移動端開發

一,需求背景:

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資源檔案;

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

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

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/553485.html

標籤:其他

上一篇:無人直播插件 直播替換安裝使用教程

下一篇:返回列表

標籤雲
其他(159757) Python(38169) JavaScript(25456) Java(18129) C(15231) 區塊鏈(8268) C#(7972) AI(7469) 爪哇(7425) MySQL(7213) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5873) 数组(5741) R(5409) Linux(5341) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4576) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2434) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1976) 功能(1967) Web開發(1951) HtmlCss(1948) C++(1922) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1878) .NETCore(1861) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • Flutter熱更新技術探索

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

    uj5u.com 2023-05-26 15:05:50 more
  • 無人直播插件 直播替換安裝使用教程

    無人直播插件 直播替換安裝使用教程 一、適用機型及系統1、機型:所有iphone機型,可越獄即可2、系統:支持13系統及以上所有可越獄系統二、安裝手機端1、越獄(1)Windows越獄方法:電腦端安裝愛思助手,點擊工具 》一鍵越獄 》 選擇uncover 》開始越獄,如提示需要登錄,點擊商城,注冊并 ......

    uj5u.com 2023-05-25 10:54:39 more
  • Flutter三棵樹系列之詳解各種Key

    key是widget、element和semanticsNode的唯一標識,同一個parent下的所有element的key不能重復,但是在特定條件下可以在不同parent下使用相同的key,比如page1和page2都可以使用ValueKey ......

    uj5u.com 2023-05-25 10:54:03 more
  • 無人直播插件 直播替換安裝使用教程

    無人直播插件 直播替換安裝使用教程 一、適用機型及系統1、機型:所有iphone機型,可越獄即可2、系統:支持13系統及以上所有可越獄系統二、安裝手機端1、越獄(1)Windows越獄方法:電腦端安裝愛思助手,點擊工具 》一鍵越獄 》 選擇uncover 》開始越獄,如提示需要登錄,點擊商城,注冊并 ......

    uj5u.com 2023-05-25 10:52:59 more
  • 《蘇丹的復仇》攜手華為HMS生態,實作用戶、收入雙增長

    中國出海中東和北非地區的策略類手游《蘇丹的復仇》(Revenge of Sultans,ROS)和華為HMS生態深度合作,為本地用戶帶來創新游戲體驗,成為當地廣受歡迎的游戲之一,下載量居應用市場前列。2023年5月10日,在阿聯酋迪拜舉辦的HUAWEI P60系列及旗艦產品發布會中,ONEMT中東G ......

    uj5u.com 2023-05-24 09:35:30 more
  • 《蘇丹的復仇》攜手華為HMS生態,實作用戶、收入雙增長

    中國出海中東和北非地區的策略類手游《蘇丹的復仇》(Revenge of Sultans,ROS)和華為HMS生態深度合作,為本地用戶帶來創新游戲體驗,成為當地廣受歡迎的游戲之一,下載量居應用市場前列。2023年5月10日,在阿聯酋迪拜舉辦的HUAWEI P60系列及旗艦產品發布會中,ONEMT中東G ......

    uj5u.com 2023-05-24 09:35:09 more
  • 京東購物車如何提升30%性能

    本文主要介紹在業務復雜化背景下,京東零售購物車團隊努力踐行工匠精神,通過全異步化改造提升系統性能、提升用戶體驗。通過本文,讀者可以了解購物車中臺進行全異步化改造的總體方案,以及方案落地程序中遇到的問題及解決方法,讀者可重點關注文中提到的多分頁并行后,分頁精細控制及底層RPC例外資訊問題。 ......

    uj5u.com 2023-05-23 13:12:04 more
  • 關于微信小程式原生組件與uniApp混合開發程序遇到的問題與解決方

    前言: 在實際開發程序中,尤其是小程式的開發,我們常常會遇到一些在檔案中解決不了的問題,在這里,我就淺談一下我遇到的一些問題 1.小程式的構建框架是uni-app,卻突然被要求用原生的微信小程式代碼來開發,到最后要整合到uni-app里面 這個整合問題,uni-app官網就有解決方式,這里就不多說, ......

    uj5u.com 2023-05-23 10:18:21 more
  • 從熱愛到深耕,在開發路上的他們勇敢逐夢

    2022年的程式員節, #大齡程式員去哪兒了#成為了社交媒體上最火的話題之一,程式員的職場成長問題在社會上引起了廣泛關注。 有2位在技術領域摸爬滾打很多年的開發者,35歲后的他們,有70后,有80后,依然在編程開發,依然有離職創業的勇氣,努力實作自己的人生價值。走進他們的故事,你會發現,這個世上沒有 ......

    uj5u.com 2023-05-23 10:18:13 more
  • 從熱愛到深耕,在開發路上的他們勇敢逐夢

    2022年的程式員節, #大齡程式員去哪兒了#成為了社交媒體上最火的話題之一,程式員的職場成長問題在社會上引起了廣泛關注。 有2位在技術領域摸爬滾打很多年的開發者,35歲后的他們,有70后,有80后,依然在編程開發,依然有離職創業的勇氣,努力實作自己的人生價值。走進他們的故事,你會發現,這個世上沒有 ......

    uj5u.com 2023-05-23 10:17:45 more