Flutter Android 热修复方案(3.22.0)

本文基于Flutter 3.22.0 实现

Flutter 在 Android 的Release编译产物为 libapp.so,我们只需要把它换成我们要修复的so即可。

实现方案有两种:

1. 重写以下代码

复制代码
FlutterApplication
FlutterInjector
FlutterLoader
FlutterApplicationInfo
ApplicationInfoLoader
ResourceExtractor

这个文件中的相互饮用都需要修改为重写的类,此外最核心的地方是要修改 `FlutterLoader` 里面的内容:

dart 复制代码
shellArgs.add("--aot-shared-library-name=" + this.flutterApplicationInfo.nativeLibraryDir + File.separator + this.flutterApplicationInfo.aotSharedLibraryName);

修改为

File dir = applicationContext.getFilesDir();
                        File soFile = new File(dir.getAbsoluteFile() + File.separator + "libapp.so");

                        shellArgs.add("--aot-shared-library-name=" + (soFile.exists() ? dir.getAbsolutePath() : this.flutterApplicationInfo.nativeLibraryDir) + File.separator + this.flutterApplicationInfo.aotSharedLibraryName);
                        

然后再把新的 libapp.so 下载到fileDir 文件夹中。

这里需要注意几个点:

  1. 版本控制
  2. 文件完整性检测
  3. 加载异常容错方案

2. 修改engine 然后重新编译

修改源码

按照第一种方案对

shell/platform/android/io/flutter/embedding/engine/loader/FlutterLoader.java

文件进行修改

编译 engine

修改groovy

flutter/packages/flutter_tools/gradle/src/main/groovy/flutter.groovy

注释掉

复制代码
addApiDependencies(
              pluginProject,
              buildType.name,
              "io.flutter:flutter_embedding_$flutterBuildMode:$engineVersion"
            )

然后再Android项目中加入编译后的库。即可实现和第一种一样的效果。

StoreBird

专门用于实现Flutter 补丁修复的。

但是使用起来需要翻墙,不太适用于国内用户。是根据分发补丁包的数量进行收费的

相关推荐
程序员老刘37 分钟前
Dart MCP翻车了!3.9.0版本无法运行,这个坑你踩过吗?
flutter·ai编程·客户端
安卓开发者1 小时前
Android Glide最佳实践:高效图片加载完全指南
android·glide
菠萝加点糖2 小时前
Android 使用MediaMuxer+MediaCodec编码MP4视频
android·音视频·编码
ideal树叶3 小时前
flutter 中 的 关键字
flutter
雨白3 小时前
手写 MaterialEditText:实现浮动标签(Floating Label)效果
android
CYRUS_STUDIO5 小时前
使用 readelf 分析 so 文件:ELF 结构解析全攻略
android·linux·逆向
世界不及妳微笑6 小时前
Flutter 记录应用授权登录踩坑之旅
flutter
小强开学前6 小时前
WebView 静态页面秒加载方案要点
android·webview
纽马约6 小时前
Android Room的使用详解
android
游戏开发爱好者87 小时前
基于uni-app的iOS应用上架,从打包到分发的全流程
android·ios·小程序·https·uni-app·iphone·webview