本文基于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 文件夹中。
这里需要注意几个点:
- 版本控制
- 文件完整性检测
- 加载异常容错方案
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 补丁修复的。
但是使用起来需要翻墙,不太适用于国内用户。是根据分发补丁包的数量进行收费的