Flutter 1.17.x 时有做过,需要修改并自行编译 flutter/engine ,翻了下当时的笔记给个思路:
(假如编译产物动态下发后的路径分别为 /path/to/
libflutter.so, /path/to/
libapp.so, /path/to/flutter_assets/)
1. 修改
platform_view_android_jni.cc:RunBundleAndSnapshotFromLibrary ,把 jAssetManager 参数换成 jstring 用于传入资源文件路径,然后函数实现中 jAssetManager + APKAssetProvider 构造 asset_manager 换成 jstring + DirectoryAssetBundle 构造 asset_manager 。
2. 修改 FlutterJNI.java:C++ 层 RunBundleAndSnapshotFromLibrary 映射过来的 JNI 函数 nativeRunBundleAndSnapshotFromLibrary 对应把 assetManager 参数改成 String ,并在这个函数调用处传入 /path/to/flutter_assets/。
3. 修改 FlutterLoader.java:startInitialization 中 System.loadLibrary("flutter") 改为 System.load(“/path/to/
libflutter.so”),ensureInitializationComplete 中引擎启动 shellArgs 传入的 DEFAULT_LIBRARY 和 aotSharedLibraryName 分别改成 /path/to/
libflutter.so 和 /path/to/
libapp.so 。
修改完 1 后编译引擎得到有资源动态加载能力的
libflutter.so ,修改完 2 和 3 后编译 io/flutter/embedding 得到 aar 后引入项目跟随 apk 打包发版。使用时确保产物已动态下发,在 Flutter 引擎初始化时 3 的变更用来动态加载修改版引擎
libflutter.so 和业务逻辑
libapp.so ,1 + 2 的变更用来动态加载 flutter_assets 。
简单看了下最新 Flutter 3.x 源码中这三个入口变化不是特别大,OP 可照这个思路尝试。