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 引擎层结构分析:

Flutter热更新技术探索

3.2.2 Android编译产物的分析

Flutter热更新技术探索

Flutter热更新技术探索

3.2.3 IOS编译产物的分析

Flutter热更新技术探索

Flutter热更新技术探索

四,热更新技术方案分析

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

Flutter热更新技术探索

4.2 业务代码的加载分析(运行时)

按照4.1的分析思路,我们首先需要了解Flutter运行时代码加载的完整流程,经过梳理分析流程如下:

1 )Android- APP业务代码的加载流程:

Flutter热更新技术探索

2)IOS- APP业务代码的加载流程:

Flutter热更新技术探索

4.3 业务代码的编译生成(编译时)

根据以上的分析,我们知道了Flutter业务代码的数据结构,也知道了在运行时如何加载,因此我们只需要在编译时做更改,产生自己需要的代码段,和数据段文件。在运行时加载自己的构建产物即可达到目标。

1)在此以 IOS 构建自己的业务代码流程做详细分析:

Flutter热更新技术探索

**有完成构建流程可以分析,基本流程是“Dart Code(业务代码)” -> (通过Dart编译器gen_snapshot.cc) 生成 snapshot_assemble.S 的汇编文件 -> (通过xcrun工具)生成 snapshot_assemble.o的obj文件 -> (通过xcun clang工具链) 生成了 App.Framework。

2)Android的产物构建流程和IOS类似。由于Android有其他更简单的方案, 因此省略详细的构建流程分析,大致如下:

Flutter热更新技术探索

4.4 实现热更新的方案探索

根据上面的技术分析结果,已经可以独立生成自己的代码段,数据段文件。通过需改虚拟机底层代码的方式,也可以动态的加载运行。但由于IOS系统目前底层的系统还不能动态加载可读写的代码段数据到内存中,所以还有技术难点需要突破。但Android端有更简单的路径可以解决,因此下面以Android端为例重点分析思路,大致如下图所示:

Flutter热更新技术探索

由上图可以得知,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.toymoban.com/news/detail-459587.html

到了这里,关于Flutter热更新技术探索的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 国家电网 计算机 《信息新技术》 整理

    分布式数据库、分布式文件系统、虚拟化、区块链等基本概念、主流框架 分布式数据库(DDB,Distributed Database)︰ 数据库 技术与 网络技术相结合 的产物。“ 集中计算\\\"概念向“分布计算\\\"概念发展 。数据按实际需要已在网络上分布存储。分布式数据库是这些大型企业用户(如电

    2023年04月22日
    浏览(59)
  • JMUer-网络新技术课程期末考试复习整理

    ✏️write in front✏️ 📝个人主页:陈丹宇jmu 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 🙉联系作者🙈by QQ:813942269🐧 🌈致亲爱的读者:很高兴你能看到我的文章,希望我的文章可以帮助到你,祝万事顺意🏳️‍🌈 ✉️少年不惧岁月长,彼方尚有荣光在 🏆 题型 分值

    2024年02月04日
    浏览(50)
  • Java 新技术:虚拟线程使用指南(二)

    虚拟线程是在 Java 21 版本中实现的一种轻量级线程。它由 JVM 进行创建以及管理。虚拟线程和传统线程(我们称之为平台线程)之间的主要区别在于,我们可以轻松地在一个 Java 程序中运行大量、甚至数百万个虚拟线程。 由于虚拟线程的数量众多,也就赋予了 Java 程序强大的

    2024年02月03日
    浏览(39)
  • 引领创新的软件开发和新技术实践

    在快速发展的科技时代,软件开发领域不断涌现出新的技术和创新方法。通过引领创新的软件开发和积极应用新技术,团队可以更好地适应市场需求,提高产品竞争力。本文将介绍一些引领创新的软件开发和新技术实践。 采用敏捷开发方法和迭代模型,将软件开发过程划分为

    2024年01月22日
    浏览(80)
  • 新技术前沿-2023-ChatGPT基于人工智能技术的聊天机器人

    chatgpt镜像网站 一文带你了解爆火的Chat GPT ChatGPT系列文章 为什么ChatGPT这么强?—— 一文读懂ChatGPT原理! ChatGPT是一种基于人工智能技术的聊天机器人,它可以模拟人类对话,回答用户的问题和提供相关信息。ChatGPT使用 自然语言处理技术 ,可以与用户进行语音或文本交互,

    2023年04月15日
    浏览(75)
  • 3D轻量化引擎推出新技术,模型渲染更逼真!

    HOOPS Communicator在2021版本中,推出了基于PBR(Physically Based Rendering)的渲染特性以提供更高质量的渲染技术。 PBR将材料表示为一系列方程,这些方程对光如何从表面反射进行建模,再通过GPU上运行的着色器代码进行有效地实现。 在过去的30年里,PC端的3D轻量化功能取得了令人

    2024年02月08日
    浏览(35)
  • 替代堆叠的新技术M-lag

    M-lag:跨设备链路聚合组,是一种实现跨设备链路聚合的机制。将一台设备与另外两台设备进行跨设备链路聚合,从而把链路的可靠性从单板级提升到设备级,组成双活系统。 基本概念: peer-link链路:是一条聚合链路(可靠性),用于协商报文及传输部分流量。 keepalive链路

    2024年01月21日
    浏览(51)
  • 金融私有云IAAS领域、云平台领域、架构领域、新技术领域的技术展望

    【摘要】 本文展望了金融私有云IAAS领域、云平台领域、架构领域、新技术领域的技术发展,包括需求背景、优势、缺点、应用场景,供金融同行参考。 在新一轮科技革命和产业变革的背景下,从金融数字化角度来看,金融行业对于科技的要求越来越高,也日益聚焦于金融科

    2023年04月10日
    浏览(52)
  • 人工智能时代,如何借助新技术实现突破?| 圆桌对话

    继上篇介绍完干货满满的议题分享后,更精彩的圆桌论坛衔尾相随。本次圆桌对话以“人工智能时代,如何借助新技术实现突破?”为主题,由华锐技术机构市场团队负责人-高媛主持,邀请了AMD中国区数据中心事业部资深架构师-梁朝军,火山引擎证券行业解决方案负责人-陈

    2024年02月19日
    浏览(49)
  • Segment Anything:突破边界的图像分割新技术解析

    Segment Anything论文地址: https://arxiv.org/pdf/2304.02643.pdf 在自然语言处理中,基于大规模语言模型的零样本和少样本学习已经取得了重要进展。在计算机视觉领域,例如CLIP和ALIGN,通过工程化的文本提示可以实现对新视觉概念的零样本泛化。 本论文中,我们提出了可提示的分割任

    2024年02月12日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包