仔细研究了阳光七月的更新方案(感谢阳光七月,前人栽树,后人乘凉),再根据自己的需求,说下我思考的吧:
关于打包:game.zip(不包括main和update模块),update.zip(独立出来,便于更新update模块本身),其他各种资源(png,plist,mp3等)
更新流程:
1、main.lua中判断upd中有无update.zip模块,有则加载upd中的,无则加载res中的update.zip模块,这样就可以实现了更新脚本本身的更新
2、在appdeletegate中不加载framwork_precompiled.zip,在update模块中判断upd中有无framwork,有则加载upd中的,无则加载res中的framwork,这样就实现了framwork本身的更新
3、更新各种资源,这个比较简单,跟前面人的想法一样,按md5差异化更新,不赘述(值得注意的是,需要一份resources文件,所有资源的路径写在这里面,如bg1=“bg1.png”,bg2=“upd/bg2.png”,如果bg1更新了,直接在resources里修改bg1=“upd/bg1.png”,这样就解决了game.zip里面从哪里加载图片的问题,只需要改resources文件就可以了,不用管先搜索哪个路径)
亮点:
1、可以更新update本身
2、可以更新framework本身
3、可以根据服务器反馈的信息,加上友盟更新,实现某个版本直接安装apk(安装之前需要删除upd中的game.zip和update.zip)
4、可以记录更新过程,实现“断点继传”,比如一次有100个文件需要更新,这次下了50个挂掉了,重新启动后可以从第51个开始下载,不需要回滚!
致此,更新的完美解决方案已实现了,我想要的功能基本都实现了,求赞,求批评指正,求更完美,求大神们代码化,然后分享下!我觉得差异化更新可以加到quick的框架中。大家基本都需要。
支持!各人按自己的需求修改才是最适合自己的,呵呵

用MD5比较资源比较准确但是,速度可能比较慢,可以用时间戳加文件大小判断
自己实现吧,更有说服力
— Begin quote from ____
引用第5楼麒麟子于2014-06-20 12:08发表的 :
MD5其实挺快的,一般前面几个字符就不一样了。
http://www.cocoachina.com/bbs/job.php?action=topost&tid=208415&pid=983842
— End quote
你们说的难道不是用MD5计算本地文件 然后在比较么
关于”用MD5比较资源比较准确但是,速度可能比较慢“,其实一次更新的文件数量应该不会太多,所以我认为不会有大的影响的。
代码唉,不怎么会c++,appdeletegate中选择性加载game.zip或framwork.zip都不会,昨晚搞了半天,没成功!好像CCLOG在控制台都没信息输出的。。。
:880:
不建议每次计算MD5
就算用户不篡改,假如更新中因为某些情况中断了,恰巧一个文件没更新完.直接比较本地列表和服务器列表会出问题.
时间撮和文件大小一般来说问题不大.
至于代码的有效性验证可以比资源更严格,MD5和crc32应该都可以.

你如何知道哪些文件需要更新的?
假如是本地保存了一份文件列表及对应文件的版本信息,那么会出现我之前说的更新中断的问题.
如果是从服务器文件列表中取版本信息和本地文件进行对比那是不是要计算每个文件的md5?
再假如游戏文件数量不多体积不大,那没问题.

对更新文件进行效验是需要的.
是否需要临时文件来处理,看个人吧.
不用临时文件,也可以计算MD5来比较.
:878:
不过话说以上言论都是我没用过cocos2dx的前提下做出的.
和我现有的更新方案很类似,:875:
上述存在一个问题:当前更新中有 update本身 或者 framework 只有下次启动才会生效。
update的最后判断一下,更新文件中是否有update,有的话,回到main,加载新的update再进入update,没有的话,就看看更新文件中是否有frameWork,有的话,重新加载一下,然后进入游戏,没有的话,直接进入游戏。
保存文件的md5列表就可以了,至于防止玩家篡改,源代码是加密的,玩家改不了啊。图片之类的,改也就改了,不会有什么影响吧。极少情况下有部分可能会有影响的,可以把这部分列出来,每次核查md5,但是这个跟更新其实没什么关系了,因为难道不更新,玩家就不会篡改了吗?
至于代码,appDelegate中选择性加载game.zip,我还不会…昨晚试验了好多次,感觉代码都是对的,但就是不成功。CCLOG在player中怎么就没信息输出呢?好吧,我真不怎么会C++,我估计是路径搞错了,c++的string很奇怪。
怎么再回到main?
require(“main”)
还是应该在AppDelegate中选择性加载game.zip和framework.zip吧,在main.lua和update.lua中没有require(“framework.init”)之前都找不到upd目录(device.writablePath下面)
简单地做,AppDelegate里还是会load res下的framework,每次update完了,不管有没有更新文件,都判断一下upd下有没有framework.zip,有的话就再load一次,这样就能framework都是最新版本了
哦,重新load一下就可以了啊,内部也都自动的更新了?不太清楚原是,如果这样的话,倒也方便了。
CCLuaLog或是printLog(“INFO”, …)