女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

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

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

OSC開(kāi)源社區(qū) ? 來(lái)源:OSCHINA 社區(qū) ? 作者:OSCHINA 社區(qū) ? 2023-06-08 14:31 ? 次閱讀

來(lái)源 | OSCHINA 社區(qū)

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

一,需求背景:

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

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

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

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

因?yàn)槠渌绞蕉加虚_(kāi)源的示例,本案將重點(diǎn)以第三種 “Dart 虛擬機(jī)定制方案” 為目標(biāo),做方案的研究講解。

三,預(yù)備知識(shí)

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

3.1 Flutter 編譯模式

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

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

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

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

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

Flutter 下的 iOS/Android 工程本質(zhì)上是一個(gè)標(biāo)準(zhǔn)的 iOS/Android 的工程;IOS 平臺(tái): Flutter 通過(guò)在 BuildPhase 中添加 shell (xcode_backend.sh) 來(lái)生成和嵌入 App.framework 和 Flutter.framework 到 ios; Android 平臺(tái): Flutter 通過(guò) gradle 來(lái)添加 flutter.jar 和編譯完的二進(jìn)制文件添加到 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è)務(wù)代碼分析

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

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

注釋?zhuān)篿solate, snapshot, vm isolate 含義解釋如下:

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

wKgaomSBddWALgYLAAKZnj4d3V0393.png

4.2 業(yè)務(wù)代碼的加載分析(運(yùn)行時(shí))

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

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

wKgaomSBddWAI99fAAGJbkA3lbI723.png

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

wKgaomSBddWAagZ7AAOsazD2e9U838.png

4.3 業(yè)務(wù)代碼的編譯生成(編譯時(shí))

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

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

wKgZomSBddWAGiKNAASum8t4Xiw488.png

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

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

wKgZomSBddWAeA-fAAB_PMDOBqY908.png

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

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

wKgaomSBddaANHNfAAF3EAyPXcA741.png

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

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

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

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

4, APP 啟動(dòng)時(shí)訪(fǎng)問(wèn)后端接口,根據(jù)參數(shù)(app 的版本號(hào),補(bǔ)丁包版本號(hào),md5,flutter SDK 版本號(hào),Engine 版本號(hào))拉取補(bǔ)丁包;

5, 合成補(bǔ)丁包:校驗(yàn) md5,app 版本號(hào),補(bǔ)丁版本號(hào),安裝時(shí)間;

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

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

    關(guān)注

    12

    文章

    3962

    瀏覽量

    129525
  • 開(kāi)源
    +關(guān)注

    關(guān)注

    3

    文章

    3582

    瀏覽量

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

    關(guān)注

    8

    文章

    3399

    瀏覽量

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

    關(guān)注

    0

    文章

    156

    瀏覽量

    15953
  • flutter
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    530

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

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

收藏 人收藏

    評(píng)論

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

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

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

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

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

    鴻蒙Flutter實(shí)戰(zhàn):10-常見(jiàn)問(wèn)題集合

    # 鴻蒙Flutter實(shí)戰(zhàn):10-常見(jiàn)問(wèn)題集合 ## 1. 學(xué)習(xí)路徑應(yīng)該是怎樣的,需要掌握哪些技術(shù)才具備鴻蒙 Flutter 開(kāi)發(fā)能力 1.1 學(xué)習(xí)和掌握 Flutter 開(kāi)發(fā)
    發(fā)表于 10-23 17:05

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

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

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

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

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

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

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

    未來(lái)IC技術(shù)發(fā)展的道路不再是一條直線(xiàn)。開(kāi)箱即用的解決方案的需求將迎來(lái)創(chuàng)新的黃金時(shí)代。未來(lái)的電子系統(tǒng)將需要計(jì)算架構(gòu)以及設(shè)備和封裝技術(shù)的共同創(chuàng)新。那么,全球晶圓代工龍頭臺(tái)積電為了將代工這活兒做到極致,又在探索哪些
    的頭像 發(fā)表于 05-17 11:14 ?3686次閱讀
    臺(tái)積電又在<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! 我們總計(jì)合并了 5,248 條 PR,感謝各位 Flutter 貢獻(xiàn)者的辛勤工作! 此版本中激動(dòng)人心的升級(jí)包括: 更新
    的頭像 發(fā)表于 05-24 17:48 ?2591次閱讀

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

    又到了 Flutter 穩(wěn)定版發(fā)布時(shí)間,我們無(wú)比自豪地宣布推出 Flutter 3!僅 3 個(gè)月前,我們宣布了 Flutter 對(duì) Windows 的支持。現(xiàn)在,我們?cè)俅螒阎?dòng)的心情宣布,繼 Windows 之后,
    的頭像 發(fā)表于 06-22 16:13 ?1257次閱讀

    Flutter Go Flutter學(xué)習(xí)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>學(xué)習(xí)App

    Flutter Forward 活動(dòng)即將到來(lái)!

    Flutter 的全球盛會(huì) Flutter Forward 將于 2023 年 1 月 25 日在肯尼亞內(nèi)羅畢舉行。諸多 Flutter更新內(nèi)容不容錯(cuò)過(guò),期待與您 線(xiàn)上 見(jiàn)面。 活
    的頭像 發(fā)表于 12-22 23:05 ?1170次閱讀

    Flutter 共創(chuàng)未來(lái) | Flutter Forward 活動(dòng)精彩回顧

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

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

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

    了解 Flutter 3.16 功能更新

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

    淺談兼容 OpenHarmony 的 Flutter

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