热更新黑屏问题(必现)——已找到问题,欢迎避坑

creator版本:2.0.8;
问题出现过程
本地版本1.0.0.0,登录场景背景图为A;更新到版本1.0.0.2,把登录场景背景图换为B(B图片只有1.0.0.2中有);再更新到版本1.0.0.1,把背景换回A。1.0.0.2到1.0.0.1的更新过程中杀掉APP,再次打开APP的时候黑屏,报错信息为找不到图片B对应的json文件,导致无法启动登录场景。
有人知道是什么原因吗?能否帮忙分析一下
@jare @panda @huanxinyin

@BigBear

打包的时候把合并图集中的SpriteFrame勾去掉试一下

1.0.0.0更新->1.0.0.2,然后更新到1.0.0.1?后面这一步的更新是有问题的把,版本号比现有版本号还要低?
稍等,我这边测试一下。可以的话你这边给个demo过来我看一下,方便一些

我的包比较大,不是很好发,正常情况是不会高版本到低版本更新的,我这也是测试各种更新情况发现的

这东西一直没勾过:joy:

你看下你版本控制这一块的代码,客户端这边与服务器版本的校验。
如果你是和官方热更新示例里面的逻辑相同,从目前的情况来看,可能是在客户端版本 > 服务器版本的时候,并没有进行更新,或者是客户端默认还是使用的高版本,导致的资源使用的错误



可以在AssetsManagerEx.cpp和Manifest.cpp中打下断点,跟踪一下,看下有没有问题

问题出在这个位置,更新前把文件删除了,我更新一半退出再回来,肯定就黑屏了

Nice,找到问题点就好:+1:,一般更新界面的图片最好不要删除吧,一般都是打增量包

问题是怎么处理,这里把一些json删除了,直接更新完是没有问题,但是热更新中途我杀掉APP再回来,肯定是会挂的呀

可以考虑把资源文件全部更新完之前 先改名放到本地
防止资源更新失败导致进不去游戏
等确认所有资源更新成功后 在把所有资源名改正确

现在的问题是,开始下载新资源前,部分老的资源已经被删了

这个删除操作在老版本里面是没有,我想这里的设计是为了节约资源,但是没有考虑到中途杀APP的情况,还请大佬们有空时看一下,我现在是把删除屏蔽掉了,没有问题

这个问题之前遇到过,可以更新,更新完可以进游戏,杀进程后加载不了缺了json的场景,原因是我们加了资源,然后更新的时候只有资源,没有对应的json,加载场景就会报错,取消合并图集中的SpriteFrame后正常了

问题不在热更新吧,应该是在资源加载吧。
我之前发过一篇贴,场景中依赖资源丢失,场景就会加载失败,引擎组的人说是设计如此,但我觉得始终不合理。
https://forum.cocos.com/t/bug-2-0-8/74095/7?u=tuyazuo

可以改一下更新流程,先比对版本,然后更新文件到本地的一个update文件夹中,等所有更新文件下载完毕后,再进行资源的删除,以及将update下的文件复制到包里,也就是执行真正的更新文件操作。最终完成后restart

我们的问题可能不一样,你可以看我上面的热更新调试过程,我已经很清楚的看到在下载新版本前,它把缓存里多余的文件删除了,100%必发的

是的,这样可以,但是引擎里的这个删除操作我觉得还是有待斟酌,毕竟直接黑屏还是比较严重的

引擎的AssetsManagerEx热更新这块代码的处理应该是有问题的
1.这部分删除操作的代码在1.9.*的版本中是没有的,但是在2.0.8的版本中有。
2.这里删除的时机会导致问题。例如:
从A版本更新到B版本,新增了一张背景图,新增的背景图资源会放在_storagePath中。
从B版本更新到C版本中,又移除了这张背景图,prepareUpdate的时候,判断出背景图是需要移除的,,就直接移除了_storagePath中的背景图,这个时候杀掉App,升级操作并没有完成。
重新打开App,B版本中使用的那张背景图还是被需要的,但是刚才热更新的时候已经移除掉了,这个时候就会提示资源不存在,导致程序启动失败。
AssetsManagerEx中的删除操作应该需要在更新完全成功后再进行。

全部下载成功后
应该不需要资源删除操作吧
只是 将新资源 替换同名的旧资源就好了