要修改下,官方提供的version_generator.js文件,让它在manifest文件中记录main.js文件
/**
* @description 这是一个用于生成 Manfiest 文件的 NodeJS 脚本。使用方式如下:
* @example node version_generator.js -v 1.0.0 -u http://your-server-address/remote-assets/ -s native/package/ -d assets/
* @param `-v` 指定 Manifest 文件的主版本号。
* @param `-u` 指定服务器远程包的地址,这个地址需要和最初发布版本中 Manifest 文件的远程包地址一致,否则无法检测到更新。
* @param `-s` 本地原生打包版本的目录相对路径。
* @param `-d` 保存 Manifest 文件的地址。
*
*
* !!!!!改动
* #1 加变量,地址更改时就改address就行了
*
* #2 输出文件夹 dest 文件夹创建时存在不会报错
*
* #3 增加变量dest1,设置assests下 project.manifest的路径。
* 放心,fs.writeFile 方法不会造成uuid的更改
* 我看有人直接把dest设为assets,这样的话assets就多了 version 和它的meta文件,这是没用的,只是热更用来放服务器上的。
*
* #4
* 增加 readFile 方法,热更指定文件<用于勾选md5 cache后更新找不到资源的问题,更新main.js文件>(build/jsb-link/main.js)
* manifest 记录 build/jsb-link/main.js的信息
*
*
* 使用方法:
* 1.第一次定版(1.0.0)后,creator build一下, 配置version_generator.js 里面的参数(dest、dest1、src、address、version), node 执行该脚本
* 2.将生成的project.manifest 挂到你个热更新组件上
* 3.再次build下项目(项目在第2步变动了),AS编译、生成APK
*
* 有热更新了(如1.0.1)
* 1.定版后,先build下项目,配置version_generator.js 里面的参数(address、version), node 执行该脚本
* 2.将assets、src main.js project.manifest version.mainfest放到热更服务器下
* 3. (不发apk可以不打)再次build下项目(项目在第1步变动了),AS编译、生成APK
*/
var fs = require('fs');
var path = require('path');
var crypto = require('crypto');
// #1
var address = "http://192.168.140.52:5151/games/tests/2.0.1/";
var manifest = {
packageUrl: address,
remoteManifestUrl: address + 'project.manifest',
remoteVersionUrl: address + 'version.manifest',
version: '2.0.1',
assets: {},
searchPaths: []
};
// var dest = './remote-assets/';// 生成的manifest文件存放目录
var dest = './tttt/';// 生成的manifest文件存放目录
// var dest = './assets/';// 生成的manifest文件存放目录,多个version就多吧,无所谓;省事,不要复制了
// #3
var dest1 = "./assets/";// 项目下project.manifest 文件路径;
// var src = './jsb-default/';// 本地原生打包版本的目录相对路径,绝对路径也可以, 主要用到下面的assets 和 src
// var src = "E:/T/CCB/5/jsb-default/";
var src = "E:/T/CCB/6/jsb-link/";
// var src = "E:/T/CCB/6/jsb-default/";
// 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) {
obj[relative].compressed = true;
}
}
}
}
// #4
function readFile(filepath, obj) {
var stat = fs.statSync(filepath);
if (!stat.isFile()) {
return;
}
var size, md5, compressed, relative;
// Size in Bytes
size = stat['size'];
md5 = crypto.createHash('md5').update(fs.readFileSync(filepath)).digest('hex');
compressed = path.extname(filepath).toLowerCase() === '.zip';
relative = path.relative(src, filepath);
relative = relative.replace(/\\/g, '/');
relative = encodeURI(relative);
obj[relative] = {
'size': size,
'md5': md5
};
if (compressed) {
obj[relative].compressed = true;
}
}
var mkdirSync = function (path) {
try {
fs.mkdirSync(path);
} catch (e) {
if (e.code != 'EEXIST') throw e;
}
}
// Iterate assets and src folder
readDir(path.join(src, 'src'), manifest.assets);
readDir(path.join(src, 'assets'), manifest.assets);
// #4
readFile(path.join(src, 'main.js'), manifest.assets);
// #2
var destManifest = path.join(dest, 'project.manifest');
var destVersion = path.join(dest, 'version.manifest');
// mkdirSync(dest);
fs.mkdirSync(path.dirname(destManifest),{recursive:true});
fs.writeFile(destManifest, JSON.stringify(manifest), (err) => {
if (err) throw err;
console.log('ttt Manifest successfully generated');
});
if (dest1) {
var assetsManifest = path.join(dest1, 'project.manifest');
fs.writeFile(assetsManifest, JSON.stringify(manifest), (err) => {
if (err) throw err;
console.log('assets Manifest successfully generated');
});
}
delete manifest.assets;
delete manifest.searchPaths;
fs.writeFile(destVersion, JSON.stringify(manifest), (err) => {
if (err) throw err;
console.log('Version successfully generated');
});
勾选Md5 Cache后,按照 kenshin 大佬提供的修改方法 修改 jsb-link\frameworks\runtime-src\Classes\AppDelegate.cpp ,就可以正常CC 热更了