写点什么

Flutter 热更新技术探索 | 京东云技术团队

  • 2023-05-26
    北京
  • 本文字数:1586 字

    阅读完需:约 5 分钟

Flutter热更新技术探索 | 京东云技术团队

一,需求背景:

APP 发布到市场后,难免会遇到严重的 BUG 阻碍用户使用,因此有在不发布新版本 APP 的情况下使用热更新技术立即修复 BUG 需求。原生 APP(例如:Android & IOS)的热更新需求已经比较成熟,但 Flutter 技术栈目前还缺少类似的技术方案,因此 Flutter 研发团队,也需要类似的热更新技术。

二,Flutter 热更新技术方向分析:

经过分析目前可能有三种可行的方案: 1)类似 RN 框架; 2)页面动态组件框架; 3)Dart 虚拟机定制方案;



因为其他方式都有开源的示例,本案将重点以第三种“Dart 虚拟机定制方案”为目标,做方案的研究讲解。

三,预备知识

在开始了解技术方案之前,需要提前了解一些相应的技术概念:

3.1 Flutter 编译模式

Flutter 开发语言是 Dart,它的编译模式来自 Dart 的编译模式,主要有 JIT(Just In Time)和 AOT(Ahead Of Time)。



Flutter 编译模式有:Debug,Release,Profile;


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;理论上只要能动态替换加载的代码段 &数据段代码即可实现目标。



注释: isolate, snapshot, vm 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 资源文件;


作者:京东科技 刘振中、周智

内容来源:京东云开发者社区

发布于: 刚刚阅读数: 3
用户头像

拥抱技术,与开发者携手创造未来! 2018-11-20 加入

我们将持续为人工智能、大数据、云计算、物联网等相关领域的开发者,提供技术干货、行业技术内容、技术落地实践等文章内容。京东云开发者社区官方网站【https://developer.jdcloud.com/】,欢迎大家来玩

评论

发布
暂无评论
Flutter热更新技术探索 | 京东云技术团队_flutter_京东科技开发者_InfoQ写作社区