热更新AssetManagerEx的bug (根据v1.4)

这里有另一个问题,是启动流程的漏洞,现在的范例里面,启动之后就立即设置了 search path,但是实际上应该先判断当前的 storage path 下的版本是否正常,再去设置 search path。我会提供一个 AssetsManager 的新 API 来检查 storage path 下的版本是否正常

你的问题出现的原因应该是,之前有热更新成功过,然后设置了 search path 到 local storage 中,再次更新失败的时候,local storage 中的 search path 仍然是有效的,就导致了错误文件被使用的问题。

用户逻辑也可以解开这个问题,就是在每次热更新开始时,删除 local storage 中保存的 search path。

如果只是下载3个文件,那么

进度33%那里就闪退了,但是文件都下载好了,这个状态闪退以后重进游戏就一切正常

log是
https://pan.baidu.com/s/1skQi86T


如果下载很多文件
进度到60%闪退,

并无temp文件,这个状态下进游戏,很多文件都不存在

闪退不是偶然的,是必定发生的

这个输出进度是到不了100%,每次闪退的位置也都差不多

我这边没有重现你的崩溃问题,会不会是跟特定机型有关系?

从 log 来看,你的崩溃情况是:

  1. 三个文件同时更新好了(并发下载的)
  2. 然后发消息给 GL 线程通知进度
  3. JS 层处理进度信息并打印进度

第一步到第二步是异步的,第二步和第三步是同步的,你的 log 中看在第二步 GL 线程只收到了一次进度信息就崩溃了。

看起来是多线程的问题,但是我无法重现所以也无法确认

刚确认了一下,1.3 版本的旧 AssetsManager 在安卓上有可能出现重复下载同一个文件并导致崩溃的问题

你可以用 Android Studio 调试来获取崩溃时的调用栈,我们可以更确定得分析。

或者建议升级到新的 AssetsManager(可以等下一个版本的 1.4 beta),应该不会有这样崩溃的问题的

经过测试是下载1个文件是没有问题的,但是下载2个,或者2个以上文件都会闪退。感觉是下载最后一个文件,最后处理以后闪退了

这样设置以后不会闪退了

v1.4分支上的 event好像有bug AssetManagerEx dispatchEvent的时候会crash 合并了最近的几个提交之后出现的bug

491 中提交了 AssetsManager 完整的修复和重构,注意拉取之后需要获取新的 external deps

https://github.com/cocos-creator/cocos2d-x-lite/pull/491

具体包含:

  1. (重要)彻底隔离临时更新文件夹和本地缓存文件夹,避免前者失败时污染后者
  2. (重要)压缩文件的解压逻辑前置到 fileSuccess 之前,保障解压成功才算是文件正确更新
  3. 修复 updateSucceed 的判断方式
  4. 保障 tempManifest 的正确保存,使得进度信息可以正确存储
  5. 修复 Manifest 中的 size 的读取字段
  6. 延迟文件夹创建逻辑到文件请求之前,确保路径正常
  7. 读取 App Package 内部 manifest 时强制清空 search path,避免读取到缓存 manifest

@moonwalker crash 问题应该也修复了,可以尝试一下

1赞

@panda, 这部分更新可以直接在v1.3 cocos2d-x-lite上合并代码来使用吗??是否有其他的dependency?

@Isqlebai 从我的 1.3 分支拉取吧

https://github.com/pandamicro/cocos2d-x-lite/tree/v1.3

记得需要运行 download-deps.py

crash的还是存在

谢谢反馈,问题原因已经找到,可以试一下 1.4 最新的分支

1.4分支是指
https://github.com/pandamicro/cocos2d-x-lite/commits/v1.4
这个么?
准备merge一下测测。。

是的,是的,就是它

@panda panda大神,看到你关于AssetManager的修复,非常感谢,就是想问下,现在我们是基于1.3开发的,产品快做完了,想问下,如何就针对这个问题,在现有的基础上修复下~~不胜感激!

看上面的回复

好的,非常感谢~

已经拉取了,也download-deps.py了,但是编译错误,log是
https://pan.baidu.com/s/1eS7i4z4
请问是什么原因呢?
这种自定义的方式都没有教程啊
是放到cocos creator下,还是工程下呢?我放工程下的cocos2dx了

@panda 我们现在热更新遇到的问题是,资源文件能成功更新,jsc文件没有生效,是什么原因呀