flutter-有哪位大佬做过打包产物动态下发吗?

2023-07-25 10:53:13 +08:00
 programbao

最近公司要求要尽可能的较小 apk 的体积;市场提供的简单方式都做了;但是有一个产物动态下发的 要修改 flutter sdk 源码;里面是 java 语言,没怎么接触过 java ,有大佬做过吗?提供一个 flutter3.x 的修改案例,或者 github 也行 [🙏]

2036 次点击
所在节点    程序员
19 条回复
programbao
2023-07-25 10:56:11 +08:00
主要发现 libapp.solibflutter.so 占用空间比较大,还有一个百度的 sdk:libBaiduMapSDK_map_v7_5_8.so ;想上传到 oss 里面,动态下载到指定包文件;现在毫无头绪 [哭]
NewTab12138
2023-07-25 11:21:35 +08:00
动态下发和 flutter 没有关系,只能通过原生的热更新框架操作,安卓原生的有微信的 tinker ,阿里的 Sophix
programbao
2023-07-25 13:20:50 +08:00
@NewTab12138 这样的吗;但是我一开始要抽离 flutter android 的一些 so 产物,安装的时候再从远程服务器拉去下来;热更新也可以做到是吗?没用过 sophix ,我去了解下
liaopen123
2023-07-25 13:24:54 +08:00
https://juejin.cn/post/7238627611265613882?searchId=202307251323553A64ACB1F891F84AC542 这个你看看 相当于在打包的时候 把 so 剥离出来 需要的时候 再从远端下载 货拉拉 有一个类似的方案
iOCZ
2023-07-25 13:30:19 +08:00
flutter 对 so 无能为力
limiter
2023-07-25 13:49:54 +08:00
没接触过 Java ?不会原生开发?那你还是趁早放弃,这不是你能搞定的事
programbao
2023-07-25 13:55:06 +08:00
@liaopen123 好的,感谢,我去看看
programbao
2023-07-25 13:56:04 +08:00
@limiter 我也没法,这是公司选项要求的,所以求助大伙们 [哭笑]
owen800q
2023-07-25 14:05:55 +08:00
Flutter 引擎太低層了,你們公司不是大𠂆,沒 C++大神放棄吧,引擎代碼不是普通公司可以維護的
owen800q
2023-07-25 14:07:26 +08:00
你这种需求建议用 webview 套 h5 重写,不应该用 flutter
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 可照这个思路尝试。
zoharSoul
2023-07-25 15:21:45 +08:00
别担心, flutter sdk 语言不是 java, 我记得好像是 cpp
programbao
2023-07-25 15:27:39 +08:00
@Bown 好的,我去看看,感谢大佬
programbao
2023-07-26 06:28:35 +08:00
难搞喔
dabbit
2023-07-26 08:52:37 +08:00
@Bown 想问一下要怎么下载.so ?是打开 app 的时候下载,下载完了再加载 flutter 吗?
mybro
2023-07-26 09:35:03 +08:00
fair
kingzeus
2023-07-26 09:36:42 +08:00
定制下 engine/loader 类,修改下 so 的路径就好了,注意必须是 release 模式。
只要确保在调用之前,so 存在就好了
Bown
2023-07-26 10:41:39 +08:00
@dabbit 如果项目是纯 Flutter App ,得改造成 plugin 然后用 Add-to-app 的方式接入,这样可以控制 Flutter 引擎的初始化。App 启动时加个 Native 页面占位并在 Native 中做处理下载,下载完成后再加载本地 so 启动引擎、渲染 Flutter 业务首页。
dabbit
2023-07-26 14:18:29 +08:00
@Bown 没想到还有改造成 plugin 这一招,感谢思路

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/959465

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX