写了一个超长的热更新文档,欢迎反馈

能不能在下载完成后,先不要把临时文件夹里的移到正式的里面?

下完后,先效验下所有需要下载的文件MD5,效验没问题后在移动?

真的有时候会莫名其妙下载完成后黑屏

比如我删除服务器上热更新资源,重新上传,上传中途,打开客户端居然能更新成功,然后重启后就是黑屏

这个热更对lua支持吗?

unity 也是用的assetbundle , cocos也用assetbundle ,如果项目一大,加上js 本来就不好维护,然后还要将资源打成assetbundle资源,项目更难维护

文章太长,现弱弱的问句,lua 和c++能用么。。:grin:

version_generator.js 中line 71 :
md5 = crypto.createHash(‘md5’).update(fs.readFileSync(subpath, ‘utf8’)).digest(‘hex’);
以‘utf8’方式读取文件计算md5,大文件就是错误的,去掉这个‘utf8’,计算的md5就和linux系统下md5sum结果一致了。
md5 = crypto.createHash(‘md5’).update(fs.readFileSync(subpath)).digest(‘hex’);

每个安装包都写死一个版本号(只能写入main.js),启动的时候检查,并写入配置文件里。每次启动的时候从配置文件读取之前写入的版本号,和当前包里写死的比较,就可以判断是不是新安装了。
为了防止忘记修改。可以把这个版本号显示到界面,并和main.js的版本号比较(通过window传递)。发现不匹配,就弹出错误提示,就不会忘记修改了。

想請教 @panda 大神一個問題,

如果我需要動態修改熱更新的位址,

我是不是在

//這個路徑下
let path = jsb.fileUtils.getWritablePath() + "project.manifest";

寫入新的project.manifest,
AssetsManager就會依據這個manifest裡的網址去做熱更新了?

謝謝 :smiley:

在android 机器中!热更新过程中强杀进程!可能导致js层奔溃的问题

热更新过程中还走热更新的状态(更新进度,更新资源。。。),强杀进程后,在进入游戏就立马还走热更新的状态机制

不走 coco2d-js v3.14 (js层打印)

求解决

是这样没错,不过我在 1.5 计划提供一些新功能,比如使用自定义的 local manifest,暂时还在测试阶段。

这个我不是很理解,重新进入游戏会直接进入更新流程?这个应该是 main.js 的问题吧?你的游戏可能是在 main.js 直接检查更新状态,并直接更新。在第二次更新的时候,发现前一次更新未完成,的确会让热更新机制发现新的更新并进入更新过程

1赞

謝謝 @panda 大神的回覆,

經由您的指點,
目前我經由在初始化AssetsManager 之前,
在WriteablePath裡,修改 version&project 的Url位址,
就能夠動態改變熱更新的伺服器位置,

不過,在AssetsManager自動取得 temp Manifest的時候,
它就會使用 temp 裡的 version&project 的路徑,

這部份則修改了 AssetsManagerEx.cpp 裡的

  1. void AssetsManagerEx::downloadManifest()
    這邊 manifestUrl = _localManifest->getManifestFileUrl(); //一律使用localManifest
  2. void AssetsManagerEx::startUpdate()
    這邊 std::string packageUrl = _localManifest->getPackageUrl(); // 也是改成用localManifest

這樣組合出來的更新位址就是正確的,也能夠正常的熱更新了

我引頸期待新功能 :slightly_smiling:

1赞

跳转场景的时候跳转不了其他项目的scene 知道这个问题吧?

新功能在下一个 1.5 测试版就可以测试了,可以看一下最新的 tutorial hot update 里面的修改,主要添加了详细的进度提示(byte 和 file),以及使用自定义 local manifest 的实例

https://github.com/cocos-creator/tutorial-hot-update/commit/620fffd2f67b427592dca0c93ae5f9b9ac8529d7#diff-e672d16e4306aced3d704154da631c57

1赞

tutorialhotupdate-mobile.app/src/project.dev.js:1778:TypeError: jsb.AssetsManager.State is undefined

真机,模拟器都是报这个错误:cry:

要用还没有发布的 1.5 新 beta 版本才支持 jsb.AssetsManager.State,耐心等一下更新

感謝 @panda 大神辛苦的努力

我發現您把 manifest 的部份開放給JSB了,
這下我就能直接使用本地端的檔案了

等下一個版本出來,我再來重新整合一次
期待下一個版本,謝謝

客户端中如何做文件的md5呢?

现在github上的的热更项目https://github.com/cocos-creator/tutorial-hot-update 是只有creator 1.5才支持么?
用1.4.2报错,找到不loadLocalManifest

对,1.5 才支持,在后续版本(预计 1.6)会提供 md5 计算接口

我的也是,xcode模拟器 报jsb.AssetsManager.State is undefined

在1.4.2中可以使用下面的方法。

var data = jsb.fileUtils.getDataFromFile(path);
var curMD5 = md5(data);
if(curMD5 == asset.md5){
cc.info(‘MD5 verify success!’);
return true;
}
else{
cc.info(‘MD5 verify fail,path a:’ + path + ‘,path b:’ + asset.path + ‘,md5 a:’ + curMD5 + ‘,md5 b:’ + asset.md5);
return false;
}
具体的MD5算法附件中有。
md5.rar (3.9 KB)

1赞