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 补丁修复的。

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

相关推荐
aningxiaoxixi1 小时前
android stdio 的布局属性
android
CYRUS STUDIO2 小时前
FART 自动化脱壳框架一些 bug 修复记录
android·bug·逆向·fart·脱壳
小蜜蜂嗡嗡2 小时前
flutter项目迁移空安全
javascript·安全·flutter
寻找优秀的自己3 小时前
Cocos 打包 APK 兼容环境表(Android API Level 10~15)
android·cocos2d
大胃粥4 小时前
WMS& SF& IMS: 焦点窗口更新框架
android
QING6184 小时前
Gradle 核心配置属性详解 - 新手指南(二)
android·前端·gradle
QING6184 小时前
Gradle 核心配置属性详解 - 新手指南(一)
android·前端·gradle
北极象5 小时前
在Flutter中定义全局对象(如$http)而不需要import
网络协议·flutter·http
明似水7 小时前
Flutter 包依赖升级指南:让项目保持最新状态
前端·flutter