最近公司要求要尽可能的较小 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 2
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 存在就好了 |