热更导致jsb_polyfill.js异常

Creator 版本: 1.5.2
android 上 通过以最下面的代码download 函数热更后(热更下来的只是资源,没有代码,也还没去用到这个资源),按返回键时导致异常,我返回键只是用 cc.director.loadScene 加载回上一个场景而已,请问我热更代码哪里不对?还是什么情况?

js error:: assets/src/jsb_polyfill.js line:17365 msg:TypeError: split[1].split is not a function

然后我在jsb_polyfill.js里面加了写日志打印

console.log("url:%s", url);
console.log("split: %s", JSON.stringify(split));
console.log("split[1]: %s", JSON.stringify(split[1]));
console.log("typeof split[1]: %s", typeof split[1]);
console.log("split.length: %d", split.length);      // length 等于 1, 这里有问题
split = split[1].split("&");
console.log("split: %s", JSON.stringify(split));

打印结果:

涂掉的部分是 download 函数中的 第二个参数 storagePath 的值,也就是热更到本地的路径

Downloader.download = function(manifestStr, storagePath, listener){
    if(_assetsManager == null){
        _listener = listener;
        _storagePath = storagePath;
        _assetsManager = new jsb.AssetsManager("", storagePath, versionCompareHandle);
        let manifest = new jsb.Manifest(manifestStr, storagePath);
        _assetsManager.loadLocalManifest(manifest, storagePath);
        if (!cc.sys.ENABLE_GC_FOR_NATIVE_OBJECTS) {
            _assetsManager.retain();
        }

        if (cc.sys.os === cc.sys.OS_ANDROID) {
            // Some Android device may slow down the download process when concurrent tasks is too much.
            // The value may not be accurate, please do more test and find what's most suitable for your game.
            _assetsManager.setMaxConcurrentTask(2);
        }
        _updateListener = new jsb.EventListenerAssetsManager(_assetsManager, updateCallback);
        cc.eventManager.addListener(_updateListener, 1);
        _assetsManager.update();
        return true;
    }else{
    }

    return false;
};

后来我把 jsb_polyfill.js 改成:

可是,这样按了返回键加载上一场景时发生异常:

debug info: jsb: ERROR: File C:/fb/cp/cocos/scripting/js-bindings/proj.android/…/auto/jsb_cocos2dx_auto.cpp: Line: 7713, Function: js_cocos2dx_Director_replaceScene

debug info: Invalid Native Object

error:: assets/src/jsb_polyfill.js line:33246 msg:Error: Invalid Native Object

jsb_polyfill.js line:33246 代码:

我也遇到过这个错误,也是只下载了资源没有代码,热更新完毕后restart下才行,你改这个源码没用。

但是我的需求不能重启。。:sob:
不知道有什么不需要重启能解决的办法。或者是我代码哪里不对。如果对的话,这个bug什么时候能修复下,或者有什么方法能在本地临时修复的

没办法不重启。
你可以下载完资源后,把当前状态持久化,restart后,在第一个场景做判断,直接进入已持久化的当前状态,效果和没重启基本是一样的,这个重启和第一次启动不太一样,速度很快的

1赞

好像解决了。。。只是稍微测试了一下,还有点问题。。。我只是下载资源而已,这里搜索路径不需要处理,所以我注释掉了。。这样就没有上面提到的异常了。。。不过有几个资源会下载失败,可能是我manifest 用的中文命名的原因。。。等下再测看看。

根据下面这段文章,才想起把搜索路径注释掉看看:

https://github.com/pandamicro/creator-docs/blob/v1.4/source/zh/advanced-topics/assets-manager.md