chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

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

3天內(nèi)不再提示

Flutter熱更新技術(shù)探索

OSC開源社區(qū) ? 來源:OSCHINA 社區(qū) ? 作者:OSCHINA 社區(qū) ? 2023-06-08 14:31 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

來源 | OSCHINA 社區(qū)

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

一,需求背景:

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

二,F(xiàn)lutter 熱更新技術(shù)方向分析:

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

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

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

三,預備知識

在開始了解技術(shù)方案之前,需要提前了解一些相應的技術(shù)概念:

3.1 Flutter 編譯模式

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

編譯模式名稱 特點 優(yōu)點 缺點
JIT 即時編譯,典型例子 V8,它可以即時編譯運行 JS,只需要輸入源代碼字符串,就可以編譯運行代碼 可以動態(tài)下發(fā)和執(zhí)行代碼,不用管 CPU 架構(gòu),可以提供動態(tài)化內(nèi)容 1, 大量字符串代碼讓 JIT 編譯器花費時間和內(nèi)存;2, 性能不好;
- - - -
AOT 預先編譯,典型例子 C/C++,通過 GCC 編譯成二進制代碼,然后安裝取得權(quán)限后才可以加載執(zhí)行 事先編譯好的,加載和執(zhí)行速度快 1, 編譯時區(qū)分 CPU 架構(gòu);2, 生成的二進制代碼包比較大;3, 二進制代碼需要取得權(quán)限才可以執(zhí)行,無法在 ios 系統(tǒng)上動態(tài)更新

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

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

3.2 Flutter 編譯產(chǎn)物分析

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

3.2.1 引擎層結(jié)構(gòu)分析:

wKgZomSBddWAEPUGAAQyS4gZMvY347.png

3.2.2 Android 編譯產(chǎn)物的分析

wKgZomSBddWACiu-AAVumPsgbBI104.png

wKgZomSBddWACKZjAAEXsqUqD-A843.png

3.2.3 IOS 編譯產(chǎn)物的分析

wKgaomSBddWARwvFAAKTsac9WYc301.png

wKgZomSBddWABNDMAADBJNnqYMo447.png

四,熱更新技術(shù)方案分析

4.1 業(yè)務代碼分析

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

名稱 注釋 作用 注釋
kDartIsolateSnapshotData Dart isolate 數(shù)據(jù)段 類信息,全局變量,函數(shù)指針等 允許動態(tài)下發(fā)
- - - -
kDartIsolateSnapshotInstructions Dart isolate 指令段 包含由 Dart isolate 執(zhí)行的 AOT 代碼 IOS 不允許動態(tài)下發(fā)
kDartVmSnapshotData vm isolate 數(shù)據(jù)段 isolate 之間共享的 Dart 堆 (heap) 的初始狀態(tài) 允許動態(tài)下發(fā)
kDartVmSnapshotInstructions vm isolate 指令段 包含 VM 中所有 Dart isolate 之間共享的通用程序的 AOT 指令 IOS 不允許動態(tài)下發(fā)

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

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

wKgaomSBddWALgYLAAKZnj4d3V0393.png

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

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

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

wKgaomSBddWAI99fAAGJbkA3lbI723.png

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

wKgaomSBddWAagZ7AAOsazD2e9U838.png

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

根據(jù)以上的分析,我們知道了 Flutter 業(yè)務代碼的數(shù)據(jù)結(jié)構(gòu),也知道了在運行時如何加載,因此我們只需要在編譯時做更改,產(chǎn)生自己需要的代碼段,和數(shù)據(jù)段文件。在運行時加載自己的構(gòu)建產(chǎn)物即可達到目標。

1)在此以 IOS 構(gòu)建自己的業(yè)務代碼流程做詳細分析:

wKgZomSBddWAGiKNAASum8t4Xiw488.png

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

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

wKgZomSBddWAeA-fAAB_PMDOBqY908.png

4.4 實現(xiàn)熱更新的方案探索

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

wKgaomSBddaANHNfAAF3EAyPXcA741.png

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

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

2, 編譯 APK 時,利用 Gradle Transform 插件,根據(jù) Flutter SDK 的 engine version 動態(tài)替換官方的 Flutter engine,最終寫入修改后的 engine 到 APK;

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

4, APP 啟動時訪問后端接口,根據(jù)參數(shù)(app 的版本號,補丁包版本號,md5,flutter SDK 版本號,Engine 版本號)拉取補丁包;

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

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

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

    關(guān)注

    12

    文章

    3973

    瀏覽量

    130266
  • 開源
    +關(guān)注

    關(guān)注

    3

    文章

    3690

    瀏覽量

    43836
  • iOS
    iOS
    +關(guān)注

    關(guān)注

    8

    文章

    3399

    瀏覽量

    153103
  • BUG
    BUG
    +關(guān)注

    關(guān)注

    0

    文章

    156

    瀏覽量

    16025
  • flutter
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    584

原文標題:Flutter熱更新技術(shù)探索

文章出處:【微信號:OSC開源社區(qū),微信公眾號:OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    探索設(shè)計稿自動生成Flutter代碼的技術(shù)方案

    的工具和方法,最后嘗試大模型生成flutter代碼在項目中的實踐。 一、美團的探索 美團在2021年3月25日發(fā)表了一篇關(guān)于設(shè)計稿自動生成代碼的文章,探討了sketch2json和imgCook兩種技術(shù)方案。sketch2jso
    的頭像 發(fā)表于 11-08 10:09 ?1708次閱讀
    <b class='flag-5'>探索</b>設(shè)計稿自動生成<b class='flag-5'>Flutter</b>代碼的<b class='flag-5'>技術(shù)</b>方案

    鴻蒙Flutter實戰(zhàn):07混合開發(fā)

    項目處,引入Flutter模塊。 其優(yōu)點是方便維護和更新Flutter代碼,也可以使用重載。缺點是需要搭建Flutter開發(fā)環(huán)境,開發(fā)人
    發(fā)表于 10-23 16:00

    鴻蒙Flutter實戰(zhàn):11-使用 Flutter SDK 3.22.0

    # 使用 Flutter SDK 3.22.0 ## SDK 安裝 參考[鴻蒙Flutter實戰(zhàn):01-搭建開發(fā)環(huán)境]文章的說明,首先安裝 Flutter SDK 3.22.0。 目前鴻蒙化
    發(fā)表于 11-01 15:03

    鴻蒙Flutter實戰(zhàn):14-現(xiàn)有Flutter 項目支持鴻蒙 II

    ;flutter_inappwebview\" 每次修改完 pubspec.yaml,使用 fvm flutter pub get 更新下依賴安裝。 運行調(diào)試 用 Deveco 打開apps
    發(fā)表于 12-26 14:59

    深入理解flutter的編譯原理與優(yōu)化

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

    臺積電又在探索哪些新技術(shù)

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

    Flutter 3現(xiàn)已推出,能穩(wěn)定支持macOS和Linux

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

    關(guān)于Google Flutter 3更新內(nèi)容

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

    Flutter Go Flutter學習App

    ./oschina_soft/flutter-go.zip
    發(fā)表于 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 日在肯尼亞內(nèi)羅畢舉行。諸多 Flutter更新內(nèi)容不容錯過,期待與您 線上 見面。 活
    的頭像 發(fā)表于 12-22 23:05 ?1211次閱讀

    Flutter 共創(chuàng)未來 | Flutter Forward 活動精彩回顧

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

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

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

    了解 Flutter 3.16 功能更新

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

    淺談兼容 OpenHarmony 的 Flutter

    OpenHarmony SIG 組織在 Gitee 開源了兼容 OpenHarmony 的 Flutter。該組織主要用于孵化 OpenHarmony 相關(guān)的開源生態(tài)項目。 ? ? ▲ 倉庫地址
    的頭像 發(fā)表于 02-02 15:22 ?972次閱讀
    淺談兼容 OpenHarmony 的 <b class='flag-5'>Flutter</b>

    使用 Flutter SDK 3.27.4構(gòu)建HarmonyOS應用

    使用 Flutter SDK 3.27.4構(gòu)建HarmonyOS應用 下載鴻蒙版flutter(3.27.4版本) 項目地址:https://gitcode.com/openharmony-sig
    的頭像 發(fā)表于 06-11 09:15 ?328次閱讀