
最近公司要求要尽可能的较小 apk 的体积;市场提供的简单方式都做了;但是有一个产物动态下发的 要修改 flutter sdk 源码;里面是 java 语言,没怎么接触过 java ,有大佬做过吗?提供一个 flutter3.x 的修改案例,或者 github 也行 []
1 programbao OP 主要发现 libapp.so 、libflutter.so 占用空间比较大,还有一个百度的 sdk:libBaiduMapSDK_map_v7_5_8.so ;想上传到 oss 里面,动态下载到指定包文件;现在毫无头绪 [哭] |
2 NewTab12138 2023-07-25 11:21:35 +08:00 动态下发和 flutter 没有关系,只能通过原生的热更新框架操作,安卓原生的有微信的 tinker ,阿里的 Sophix |
3 programbao OP @NewTab12138 这样的吗;但是我一开始要抽离 flutter android 的一些 so 产物,安装的时候再从远程服务器拉去下来;热更新也可以做到是吗?没用过 sophix ,我去了解下 |
4 liaopen123 2023-07-25 13:24:54 +08:00 https://juejin.cn/post/7238627611265613882?searchId=202307251323553A64ACB1F891F84AC542 这个你看看 相当于在打包的时候 把 so 剥离出来 需要的时候 再从远端下载 货拉拉 有一个类似的方案 |
5 iOCZ 2023-07-25 13:30:19 +08:00 flutter 对 so 无能为力 |
6 limiter 2023-07-25 13:49:54 +08:00 没接触过 Java ?不会原生开发?那你还是趁早放弃,这不是你能搞定的事 |
7 programbao OP @liaopen123 好的,感谢,我去看看 |
8 programbao OP @limiter 我也没法,这是公司选项要求的,所以求助大伙们 [哭笑] |
9 owen800q 2023-07-25 14:05:55 +08:00 via iPhone Flutter 引擎太低了,你公司不是大, C++大神放吧,引擎代不是普通公司可以的 |
10 owen800q 2023-07-25 14:07:26 +08:00 via iPhone 你这种需求建议用 webview 套 h5 重写,不应该用 flutter |
11 Bown 2023-07-25 15:13:24 +08:00 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 可照这个思路尝试。 |
12 zoharSoul 2023-07-25 15:21:45 +08:00 别担心, flutter sdk 语言不是 java, 我记得好像是 cpp |
13 programbao OP @Bown 好的,我去看看,感谢大佬 |
14 programbao OP 难搞喔 |
15 dabbit 2023-07-26 08:52:37 +08:00 @Bown 想问一下要怎么下载.so ?是打开 app 的时候下载,下载完了再加载 flutter 吗? |
16 mybro 2023-07-26 09:35:03 +08:00 fair |
17 kingzeus 2023-07-26 09:36:42 +08:00 定制下 engine/loader 类,修改下 so 的路径就好了,注意必须是 release 模式。 只要确保在调用之前,so 存在就好了 |