BUG反馈 AssetsManagerEx下载ZIP解压失败时BUG

如题,
AssetsManagerEx在下载zip文件时,如果下载到的zip文件解压失败。则理论上,应该属于更新失败,但是AssetsManagerEx却依然把版本配置文件修改成最新的了。这样就会导致玩家一旦更新失败就再也更新不到正确的了。

我看了下源码问题主要出在 updateSucceed这个方法里面。

1. rename temporary manifest to valid manifest
_fileUtils->renameFile(_storagePath, TEMP_MANIFEST_FILENAME, MANIFEST_FILENAME);

这里第一步就替换了配置文件,但是直到最后才去解压的。
希望官方的人注意到这个问题。

总觉得assetsManager是个半成品……LZ说的是一个问题,还有一个,当我下载2个更新包比如分别是1.1和1.2(假设两者同时包含一个文件叫app.js),但是解压的时候1.2比1.1更早解压出来,就会导致1.1的app.js覆盖掉1.2的app.js……

直接用Downloader呗

为什么不考虑单个文件单个文件的下载

首先,单个文件下载失败了(并且在重试次数上限后还是失败了),配置文件还是已经被修改了,下次依旧没法更新。
其次,如果一个个下载,那么假设一次更新中需要更新a b c d e f 这6个文件,结果a c f这3个文件下载失败了,但b d e这3个文件下载成功了,那么就会导致本次更新成功了一半,这造成的后果是不可预料的。如果是解压失败,起码可以保证本次所有的文件都没有被更新,不会造成不可预料的后果

@panda 帮忙看一下吧

Downloader里面也是有坑的,他文件下载成功是在progress中通知出来的 然后在AssetsManagerEx中直接标记下载成功了,但是此时其实文件还没重命名掉,如果这时候出错,后面断点续传的时候也就傻逼了。

我遇到一个问题,安卓项目里

D/Cocos2dxDownloader: onSuccess(i:200 headers:[Lcz.msebera.android.httpclient.Header;@421d3818 file:/data/data/com.caomao.ddz/files/poker-remote-asset/version.manifest.tmp
D/cocos2d-x debug info: Code: 5
D/cocos2d-x debug info: Code: 3
D/Cocos2dxDownloader: onSuccess(i:200 headers:[Lcz.msebera.android.httpclient.Header;@421fd698 file:/data/data/com.caomao.ddz/files/poker-remote-asset/project.manifest.temp.tmp
D/cocos2d-x: File parse error 6 at <.json":{"md5":"804{"packageUrl":"http://>
D/Cocos2dxDownloader: onSuccess(i:200 headers:[Lcz.msebera.android.httpclient.Header;@421fe0a0 file:/data/data/com.caomao.ddz/files/poker-remote-asset/project.manifest.temp.tmp
D/cocos2d-x: File parse error 6 at <.json":{"md5":"804{"packageUrl":"http://>
D/cocos2d-x: File parse error 2 at <}},”searchPaths”:[]}{“packageUrl”:”http:>
D/cocos2d-x: File parse error 6 at <.json":{"md5":"804{"packageUrl":"http://>
D/cocos2d-x: File parse error 5 at <eroom_bg.png":{"md{"packageUrl":"http://>
D/cocos2d-x: File parse error 5 at </female_voice/fema{"packageUrl":"http://>

我每次下载version.manifest都能成功下载,但是下载project.manifest的时候大部分时候都会报错。试了不下20次,中间偶然成功下载2次。每次看错误都是下载下来的文件解析不了。而且每次错误都感觉是下载中断了又重新下载追加到之前的文件中。我每次都是删除了应用和下载目录,重新安装运行的。
相同的代码相同的资源服务器,我在ios里面就是可以成功运行的,而且一次错误都不会出现。
这个问题已经卡了我好几天了,也没找出是怎么回事,和@panda 沟通了一下,他让我在这个帖子来询问一下。
@dumganhar 求助啊

我今天花些时间缕下这块逻辑吧。

2赞

这里边bug太多了 自动更新这块总是不能让人信任

@dumganhar,怎么用?有进展吗?第一款creator产品着急上线。。。跪求

我对这个模块不熟悉,正在屡代码。有进度会同步到这里。

我又跟了一遍逻辑

D/Cocos2dxDownloader: onSuccess(i:200 headers:[Lcz.msebera.android.httpclient.Header;@421fd698 file:/data/data/com.caomao.ddz/files/poker-remote-asset/project.manifest.temp.tmp
D/cocos2d-x: File parse error 6 at <.json":{"md5":"804{"packageUrl":"http://>
D/Cocos2dxDownloader: onSuccess(i:200 headers:[Lcz.msebera.android.httpclient.Header;@421fe0a0 file:/data/data/com.caomao.ddz/files/poker-remote-asset/project.manifest.temp.tmp

我发现这里底层下载了两次manifest,应该是开启了两个线程同时在下载,文件也没上锁,导致manifest错误。
我在js代码中检查了一遍,只有在onload的时候调用了一次

this._am.checkUpdate();

所以应该不是js层代码错误导致的

目前的这个热更新 老老实实下载一个资源包是可以用的。 别做增量 做了问题就来了。

之前问过panda,-x jsb 不支持增量热更新

@dumganhar 帮我解决这个问题了。详细请看pr
https://github.com/cocos2d/cocos2d-x/pull/16801

这个是不能下载的吗?我只能看到修改 能不能把那两个文件发出来一下

会包含在新版本中。你可以可以照着改,或者你直接点进去文件拷贝代码覆盖你本地的代码。