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

不重启的话,那热更则必须要放到C++层热更才行,在加载main.js前就热更完,起码要在加载setting前面加载。

这样热更新的话,岂不是每次都要下载整个Bundle

mark一下

上边其实只讲了原理和可行性. 具体如何控制只更新一次并未讲到.
目前自己在本地已经完善了这部分功能,大概代码如下:

 // 引擎启动前需要记录一下当前版本的bundle列表.(main.js修改)
   // 暂存当前版本的md5. 用于更新patch.
    let currentBundles = settings.bundleVers;
    const currentVer = cc.sys.localStorage.getItem("currentVers");
    if (!currentVer) {
        cc.sys.localStorage.setItem("currentVers", JSON.stringify(currentBundles));
    }

  // 启动后,在loading过程中检测需要下载的bundle,并异步进行下载. (业务代码中添加执行.)
  private async doLoadBundles() {
        const updateInfo = cc.sys.localStorage.getItem("updateInfo");
        const currentVer = cc.sys.localStorage.getItem("currentVers");
        if (!updateInfo || !currentVer) return;
        let updateInfoObj = JSON.parse(updateInfo).bundles;
        let currentVerObj = JSON.parse(currentVer);

        for (let b in updateInfoObj) {
            if (updateInfoObj[b] != currentVerObj[b]) {
                console.log(">>>更新Bundle:", b);
                await Context.get().getBundle(b);
                currentVerObj[b] = updateInfoObj[b];
                cc.sys.localStorage.setItem("currentVers", JSON.stringify(currentVerObj));
                console.log("<<<Bundle更新完成:", b);
            }
        }
    }

哦哦,这样的话确实比以前的热更新简单易懂得多。

感谢大神分享,这思路看着应该原生端都可以通用吧,ios上使用会有什么问题吗

mark一下,学习了

本来就是为原生端做的. 通用逻辑.

战略插眼战略插眼

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,不能知道多少兆