APK基于Bundle 为单位 的动态热更新执行方案

战略插眼战略插眼

mark 动态热更方案

Mark···

支持一下!!!!

loadbundle能显示下载进度么

loadBundle 本身只是下载了bundle的 一个config.json文件,需要得到bundle对象后,执行preloadDir() 等接口进行资源下载操作。这些接口是有进度回调的。

下载进度是可以获取的

/**下载某个 远程Bundle */

    private loadRemoteBundle() {

        //options是可选参数,引擎会根据保留字段 进行对应的操作,这里添加了version和onFileProgress,可用来记录热更资源版本和下载进度

        let url = "http://127.0.0.1:8080/sub";

        let version = "12145"

        const options = {

            version: version,

            onFileProgress: (loaded: number, total: number) => {

                cc.log(`已经下载资源数:"${loaded}  总资源数:${total}`);

                // this.progressBar.progress = loaded / total;

            }

        }

        cc.assetManager.loadBundle(url, options, (err, bundle) => {

            if (!err) {

                // this.txtState.string = "加载远程bundle完毕"

                cc.log("time" + new Date().toTimeString())

                cc.log(cc.assetManager.assets)

                // 查询缓存路径。

                // cc.assetManager.cacheManager.getCache(bundle.base)

            }

        })

    }

mark mark

挺好的,就是没有md5校验。。。 可能有未知的问题

mark~

怎么提前写入到update.json里面去?怎么知道目前设置bundle的文件夹里面大小多少,通过自己看文件夹手动写入到里面吗?

这个是资源数,不是多少MB,不能知道多少兆

以前做2dx的时候热更新方案:
在版本文件中列举了文件的md5和对应的大小 :upside_down_face:
这样在下载某个文件完成的时候就记录完成了多少kb多少mb

原生平台不建议勾选md5,我这几天看了热更新,而且热更新的文件是那两个manifest大小。拿取不了bundle文件的大小

我采取的热更是官方差分更新和zip更新相结合:
a 新用户下载一个只带热更界面的小包 第一次运行下载缺失的zip包解压运行
b 老用户用官方manifest 只更新改动的资源代码
这样兼顾了 新玩家只需下载小包 先安装进游戏 降低流失 同时一个zip文件下载解压时间成本远小于差分下载manifest大几千个文件开销
老用户用manifest 解决了临时更新解决重大bug文件少的情况 能迅速生成差分更新版本

1赞

补充下 zip下载解压都能显示进度 这点cocos引擎底层没有实现解压进度 导致文件过大 解压时间长感觉卡死机一样 体验不好

你说的是小程序平台还是原生平台呢

原生平台 小程序是不能热更的 走另外形式

zip通过jsb.downloader来下载吗,解压是自动解压还是要用第三方工具

这个问题好解决,可以用zip4j开源的解压,当解压的时候放在ui线程就不会界面卡住了