苦海无涯,特此记录。
先吐槽一下。官方的文档要么就是古董,要么就是分散。对于我这个新上手的人来说,上来cocosCreator版本就是2.1.2了,而参考文档还是1.X的版本、几年前的说明。
1、准备工作
1、cocos Creator 版本 V2.1.2
2、Android 原生打包环境-->自行百度(主要是sdk,nkd,ant)
3、cocosCreator 热更新插件 《热更新manifest生成工具》
4、hfs网络文件服务器 2.3(自行下载、安装。主要用做本地简单服务器的搭建)
2、预备知识
1、阅读一下官方文档
https://docs.cocos.com/creator/manual/zh/advanced-topics/hot-update.html
https://docs.cocos.com/creator/manual/zh/advanced-topics/assets-manager.html
读完之后,是不是就知道更新大致需要的文档了
2、从官方文档中给出的大致过程
3、开始热更新
新建一个cocosCreator 项目。
1、开始还是先搭建一个简单的服务器
1、在硬盘中创建一个目录,用来热更新的目录
2、打开hfs.exe,将刚刚的目录拖入hfs左侧空白就会自动生成
这样就简单的生成了资源更新服务器了。
2、生成Manifest文档和更新资源包(官方是代码生成的,这里我使用的cocosCreator商店的工具)
->1、创建 version_generator.js 文件 (官方代码仓库也有)
var fs = require('fs');
var path = require('path');
var crypto = require('crypto');
var manifest = {
//服务器上资源文件存放路径(src,res的路径)
packageUrl: 'http://192.168.1.120:8080/hotUpdate/',
remoteManifestUrl: 'http://192.168.1.120:8080/hotUpdate/project.manifest',
remoteVersionUrl: 'http://192.168.1.120:8080/hotUpdate/version.manifest',
version: '1.0.2',
assets: {},
searchPaths: []
};
//生成的manifest文件存放目录
var dest = 'assets/';
//项目构建后资源的目录
var src = 'build/jsb-default/';
/**
* node version_generator.js -v 1.0.0 -u http://your-server-address/tutorial-hot-update/remote-assets/ -s native/package/ -d assets/
*/
// Parse arguments
var i = 2;
while ( i < process.argv.length) {
var arg = process.argv[i];
switch (arg) {
case '--url' :
case '-u' :
var url = process.argv[i+1];
manifest.packageUrl = url;
manifest.remoteManifestUrl = url + 'project.manifest';
manifest.remoteVersionUrl = url + 'version.manifest';
i += 2;
break;
case '--version' :
case '-v' :
manifest.version = process.argv[i+1];
i += 2;
break;
case '--src' :
case '-s' :
src = process.argv[i+1];
i += 2;
break;
case '--dest' :
case '-d' :
dest = process.argv[i+1];
i += 2;
break;
default :
i++;
break;
}
}
function readDir (dir, obj) {
var stat = fs.statSync(dir);
if (!stat.isDirectory()) {
return;
}
var subpaths = fs.readdirSync(dir), subpath, size, md5, compressed, relative;
for (var i = 0; i < subpaths.length; ++i) {
if (subpaths[i][0] === '.') {
continue;
}
subpath = path.join(dir, subpaths[i]);
stat = fs.statSync(subpath);
if (stat.isDirectory()) {
readDir(subpath, obj);
}
else if (stat.isFile()) {
// Size in Bytes
size = stat['size'];
md5 = crypto.createHash('md5').update(fs.readFileSync(subpath)).digest('hex');
compressed = path.extname(subpath).toLowerCase() === '.zip';
relative = path.relative(src, subpath);
relative = relative.replace(/\\/g, '/');
relative = encodeURI(relative);
obj[relative] = {
'size' : size,
'md5' : md5
};
if (compressed