【在安卓的模拟器上】
根据我的测试,新写的Cocos2dxDownloader 会有夺权的情况发生,不确定,很玄学,但既然在AssetsManagerEx::prepareUpdate()中操作文件打开流的时候会导致fail(),那基本就能断定通过java生成的temp文件,在cpp中会权限失败
就算我在java中为这个文件改一下权限也不行,也许是因为Cocos2dxDownloader下载后没有释放文件的某些稀奇古怪的状态?
而Cocos2dxDownloader改变特别多,还有一些重命名的操作,(下载中.tmp,完成再重命名)怀疑是不是重命名的问题导致夺权。仅仅是对玄学的猜测。
但我的关心点并不在这,只要能修好问题就好,模拟器玩家也就几十个近百个,这几天的花费让我一直觉得不太值得。
权限的玄学解决不了,就捋了一遍 热更新AssetsManagerEx的逻辑过程
而排查了AssetsManagerEx::prepareUpdate()中有这样的语句判定
849行
意思是如果 _tempManifest 存在,则释放,并删除/data/user/0/org.cocos2d.dragon/files/blackjack-remote-asset_temp/临时文件夹,再重新重建目录,并将_json write 到文件
这个谜一般的操作很不解,在downloadManifest 时,已经调用createDownloadFileTask将远程的manifest下载到了 temp目录,当前文件就已经是远程的project.manifest,为什么要将它删除?而不是直接拿来用?
因为接下来的操作就是直接将临时manifest引用remote manifest,见图。
所以改动后这里仅仅CC_SAFE_RELEASE(_tempManifest); 释放一下就好。也避免了saveToFile操作,因为一操作流就权限错误 ,还只在安卓模拟器这样(error code -1)【玄学】
而在这之后,898行,又做了一次输出流的操作
这个操作还是不解,如果说前面的删除操作再写入是为了某些保护性写法,那这个绝对没必要的吧?
保存文件操作捋一遍的话
_remoteManifest->saveToFile(_tempManifestPath);
_tempManifest = _remoteManifest;
_tempManifest->saveToFile(_tempManifestPath);
这两个保存文件的操作都没看懂在干什么,同一个文件相同的内容前提下,删了写,写一遍不行,还要再写一遍。
将这两个地方去掉后就能通过热更新。
真是一次奇妙之旅,到现在都不知道为什么流操作会失败,不过感觉是Cocos2dxDownloader的问题,
修改后热更目录文件正确

临时目录文件正确。得啦,能通过热更就行了。



