Flutter动态化技术在最右App的实战应用
2024-02-21 05:26:22
写在前面
Flutter 自诞生便备受关注,其高效的自渲染技术注定要在性能和体验上优于在这之前的跨端方案,美中不足的是目前 Flutter 不具备像 Hybrid、RN、Weex 等拥有的动态更新能力,官方也一直强调 Flutter 的目标是帮助开发者构建优秀原生应用,原生应用通常是包含应用内编译器(AOT)的,而 AOT 本身是不支持动态更新的。
基于现状,我们需要解决以下几个问题:
- 稳定性问题:在发布新版本之前,如何保证现有版本的稳定性,如何快速修复生产环境中的异常问题。
- 迭代速度问题:Flutter 项目的迭代速度相对较慢,如何提升 Flutter 项目的迭代速度。
- 灰度发布问题:如何快速、安全的进行 Flutter 模块的灰度发布,如何实现灰度发布后的版本回滚。
- 功能动态下发问题:某些功能需要按需动态下发,如何做到按需下发,如何提高按需下发过程中的性能。
Flutter 动态化方案选型
目前业界已经有很多 Flutter 动态化方案,比如:
- Flutter 官方插件:Flutter 官方提供了热修复、热更新等插件,可以满足我们的大部分需求。
- FlutterBoost:FlutterBoost 是蚂蚁金服开源的 Flutter 插件,提供了非常完善的路由管理和页面跳转功能。
- Fluro:Fluro 是一个轻量级的路由管理库,可以用于 Flutter 项目中。
- FaaS:FaaS(Function as a Service)是一种云计算服务,可以帮助我们快速构建和部署无服务器应用程序。
经过调研,我们决定采用以下方案:
- 热修复:使用 Flutter 官方插件。
- 热更新:使用 Flutter 官方插件。
- 路由管理:使用 FlutterBoost。
- 灰度发布:使用 FaaS。
Flutter 动态化实践
热修复
Flutter 官方插件提供了热修复功能,可以通过修改代码的方式修复生产环境中的异常问题。热修复的原理是:将修改后的代码重新编译成 Dart 代码,然后将新生成的 Dart 代码注入到正在运行的 Flutter 应用程序中。
热修复的具体步骤如下:
- 在开发环境中修复代码。
- 将修改后的代码提交到代码仓库。
- 在生产环境中运行以下命令:
flutter run --dart-define=FLUTTER_PATCH=1
- 查看控制台输出,确保热修复成功。
热更新
Flutter 官方插件也提供了热更新功能,可以通过替换整个 Flutter 模块的方式更新生产环境中的 Flutter 应用程序。热更新的原理是:将新的 Flutter 模块打包成一个独立的 APK 或 IPA 文件,然后将这个文件下载到生产环境中的设备上,最后替换掉旧的 Flutter 模块。
热更新的具体步骤如下:
- 在开发环境中更新代码。
- 将修改后的代码提交到代码仓库。
- 在生产环境中运行以下命令:
flutter run --release --target-platform=android-arm,android-arm64,ios
- 将生成的 APK 或 IPA 文件下载到生产环境中的设备上。
- 替换掉旧的 Flutter 模块。
路由管理
FlutterBoost 是蚂蚁金服开源的 Flutter 插件,提供了非常完善的路由管理和页面跳转功能。FlutterBoost 的原理是:将 Flutter 页面注册到路由表中,然后通过路由表来管理页面的跳转。
FlutterBoost 的使用非常简单,只需要在 main.dart
文件中注册 Flutter 页面即可。注册代码如下:
import 'package:flutter_boost/flutter_boost.dart';
void main() {
FlutterBoost.singleton.registerPageBuilders({
'flutterPage': (pageName, params, _) => FlutterPage(),
});
runApp(MyApp());
}
注册好 Flutter 页面之后,就可以通过 FlutterBoost.singleton.openPage()
方法来打开 Flutter 页面了。打开页面的代码如下:
FlutterBoost.singleton.openPage('flutterPage', {});
灰度发布
FaaS(Function as a Service)是一种云计算服务,可以帮助我们快速构建和部署无服务器应用程序。灰度发布的原理是:将新版本