V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
programbao
V2EX  ›  程序员

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

  •  
  •   programbao · 277 天前 · 1700 次点击
    这是一个创建于 277 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    19 条回复    2023-07-26 14:18:29 +08:00
    programbao
        1
    programbao  
    OP
       277 天前
    主要发现 libapp.solibflutter.so 占用空间比较大,还有一个百度的 sdk:libBaiduMapSDK_map_v7_5_8.so ;想上传到 oss 里面,动态下载到指定包文件;现在毫无头绪 [哭]
    NewTab12138
        2
    NewTab12138  
       277 天前
    动态下发和 flutter 没有关系,只能通过原生的热更新框架操作,安卓原生的有微信的 tinker ,阿里的 Sophix
    programbao
        3
    programbao  
    OP
       277 天前
    @NewTab12138 这样的吗;但是我一开始要抽离 flutter android 的一些 so 产物,安装的时候再从远程服务器拉去下来;热更新也可以做到是吗?没用过 sophix ,我去了解下
    liaopen123
        4
    liaopen123  
       277 天前
    https://juejin.cn/post/7238627611265613882?searchId=202307251323553A64ACB1F891F84AC542 这个你看看 相当于在打包的时候 把 so 剥离出来 需要的时候 再从远端下载 货拉拉 有一个类似的方案
    iOCZ
        5
    iOCZ  
       277 天前
    flutter 对 so 无能为力
    limiter
        6
    limiter  
       277 天前
    没接触过 Java ?不会原生开发?那你还是趁早放弃,这不是你能搞定的事
    programbao
        7
    programbao  
    OP
       277 天前
    @liaopen123 好的,感谢,我去看看
    programbao
        8
    programbao  
    OP
       277 天前
    @limiter 我也没法,这是公司选项要求的,所以求助大伙们 [哭笑]
    owen800q
        9
    owen800q  
       277 天前 via iPhone
    Flutter 引擎太低層了,你們公司不是大𠂆,沒 C++大神放棄吧,引擎代碼不是普通公司可以維護的
    owen800q
        10
    owen800q  
       277 天前 via iPhone
    你这种需求建议用 webview 套 h5 重写,不应该用 flutter
    Bown
        11
    Bown  
       277 天前   ❤️ 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 可照这个思路尝试。
    zoharSoul
        12
    zoharSoul  
       277 天前
    别担心, flutter sdk 语言不是 java, 我记得好像是 cpp
    programbao
        13
    programbao  
    OP
       277 天前
    @Bown 好的,我去看看,感谢大佬
    programbao
        14
    programbao  
    OP
       276 天前
    难搞喔
    dabbit
        15
    dabbit  
       276 天前
    @Bown 想问一下要怎么下载.so ?是打开 app 的时候下载,下载完了再加载 flutter 吗?
    mybro
        16
    mybro  
       276 天前
    fair
    kingzeus
        17
    kingzeus  
       276 天前
    定制下 engine/loader 类,修改下 so 的路径就好了,注意必须是 release 模式。
    只要确保在调用之前,so 存在就好了
    Bown
        18
    Bown  
       276 天前
    @dabbit 如果项目是纯 Flutter App ,得改造成 plugin 然后用 Add-to-app 的方式接入,这样可以控制 Flutter 引擎的初始化。App 启动时加个 Native 页面占位并在 Native 中做处理下载,下载完成后再加载本地 so 启动引擎、渲染 Flutter 业务首页。
    dabbit
        19
    dabbit  
       276 天前
    @Bown 没想到还有改造成 plugin 这一招,感谢思路
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1471 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 17:03 · PVG 01:03 · LAX 10:03 · JFK 13:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.