From 5ed7b96bdb49546af3972a7cf4f261f44658c9a0 Mon Sep 17 00:00:00 2001 From: skyler Date: Thu, 16 Dec 2021 17:10:50 +0800 Subject: [PATCH] update wasm split: add incremental build --- Design/WasmSplit.md | 27 +++ image/wasmsplit/incremental-split.png | Bin 0 -> 65648 bytes tools/rewrite_exception_symbol.js | 275 ++++++++++++++++++++++++++ 3 files changed, 302 insertions(+) create mode 100755 image/wasmsplit/incremental-split.png create mode 100644 tools/rewrite_exception_symbol.js diff --git a/Design/WasmSplit.md b/Design/WasmSplit.md index 8f82e13..f8b8acb 100644 --- a/Design/WasmSplit.md +++ b/Design/WasmSplit.md @@ -85,3 +85,30 @@ unity导出小游戏项目后,代码是在一个wasm文件里,经过brotli ### 关闭分包 如果想回退到未分包的版本,点击插件页的关闭代码分包按钮即可 + + +### 增量分包 + +从unity每一次导出后的小游戏,都需要重新分包,对于小版本改动会产生比较烦人的工作量 + +因此我们支持了增量分包,可以在二次导出时,通过选择之前已经进行过分包的版本,在之前分包的基础上进行增量分包 + + + +这里主要是通过symbol文件,按函数签名识别相同函数来实现的,因此需要导出时有symbol文件 + +**注意** + +由于unity 2021目前导出symbol的流程有问题,在unity修复之前,需要先手动执行下工具来导出symbol,具体见导出后的unity console信息。 + +### FAQ + +* iOS上进不去游戏 + +iOS由于加载子包的实现不同,所以最开始的收集会比较卡,这个时候可以观察分包插件面板,如果能看到有新增函数个数的变化,一般就是没问题的。如果新增函数较多(超过1000),可以先继续往下生成分包,再进行收集,这样可以加速已收集部分的运行。 + +* 没有看到增量分包的界面 + +由于增量分包是新增的功能,因此之前的项目不能被用来增量更新。更新分包插件后,第二次导出的版本开始才可以使用 + +另外对于unity 2021的版本,注意检查下minigame目录下有没有webgl.wasm.symbols.unityweb这个文件,没有的话注意按照导出时unity console的指引执行工具生成这个文件。 \ No newline at end of file diff --git a/image/wasmsplit/incremental-split.png b/image/wasmsplit/incremental-split.png new file mode 100755 index 0000000000000000000000000000000000000000..e17eb072743d2e8cb71a360077072ac94fb461bb GIT binary patch literal 65648 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 literal 0 HcmV?d00001 diff --git a/tools/rewrite_exception_symbol.js b/tools/rewrite_exception_symbol.js new file mode 100644 index 0000000..09b704f --- /dev/null +++ b/tools/rewrite_exception_symbol.js @@ -0,0 +1,275 @@ +var fs = require("fs"); +var process = require("process"); + +function demangle(func) { + // var hasLibcxxabi = !!Module["___cxa_demangle"]; + var hasLibcxxabi = false; + // if (hasLibcxxabi) { + // try { + // var buf = _malloc(func.length); + // writeStringToMemory(func.substr(1), buf); + // var status = _malloc(4); + // var ret = Module["___cxa_demangle"](buf, 0, 0, status); + // if (getValue(status, "i32") === 0 && ret) { + // return Pointer_stringify(ret); + // } + // } catch (e) { + // } finally { + // if (buf) _free(buf); + // if (status) _free(status); + // if (ret) _free(ret); + // } + // } + var i = 3; + var basicTypes = { + v: "void", + b: "bool", + c: "char", + s: "short", + i: "int", + l: "long", + f: "float", + d: "double", + w: "wchar_t", + a: "signed char", + h: "unsigned char", + t: "unsigned short", + j: "unsigned int", + m: "unsigned long", + x: "long long", + y: "unsigned long long", + z: "...", + }; + var subs = []; + var first = true; + function dump(x) { + if (x) Module.print(x); + Module.print(func); + var pre = ""; + for (var a = 0; a < i; a++) pre += " "; + Module.print(pre + "^"); + } + function parseNested() { + i++; + if (func[i] === "K") i++; + var parts = []; + while (func[i] !== "E") { + if (func[i] === "S") { + i++; + var next = func.indexOf("_", i); + var num = func.substring(i, next) || 0; + parts.push(subs[num] || "?"); + i = next + 1; + continue; + } + if (func[i] === "C") { + parts.push(parts[parts.length - 1]); + i += 2; + continue; + } + var size = parseInt(func.substr(i)); + var pre = size.toString().length; + if (!size || !pre) { + i--; + break; + } + var curr = func.substr(i + pre, size); + parts.push(curr); + subs.push(curr); + i += pre + size; + } + i++; + return parts; + } + function parse(rawList, limit, allowVoid) { + limit = limit || Infinity; + var ret = "", + list = []; + function flushList() { + return "(" + list.join(", ") + ")"; + } + var name; + if (func[i] === "N") { + name = parseNested().join("::"); + limit--; + if (limit === 0) return rawList ? [name] : name; + } else { + if (func[i] === "K" || (first && func[i] === "L")) i++; + var size = parseInt(func.substr(i)); + if (size) { + var pre = size.toString().length; + name = func.substr(i + pre, size); + i += pre + size; + } + } + first = false; + if (func[i] === "I") { + i++; + var iList = parse(true); + var iRet = parse(true, 1, true); + ret += iRet[0] + " " + name + "<" + iList.join(", ") + ">"; + } else { + ret = name; + } + paramLoop: while (i < func.length && limit-- > 0) { + var c = func[i++]; + if (c in basicTypes) { + list.push(basicTypes[c]); + } else { + switch (c) { + case "P": + list.push(parse(true, 1, true)[0] + "*"); + break; + case "R": + list.push(parse(true, 1, true)[0] + "&"); + break; + case "L": { + i++; + var end = func.indexOf("E", i); + var size = end - i; + list.push(func.substr(i, size)); + i += size + 2; + break; + } + case "A": { + var size = parseInt(func.substr(i)); + i += size.toString().length; + if (func[i] !== "_") throw "?"; + i++; + list.push(parse(true, 1, true)[0] + " [" + size + "]"); + break; + } + case "E": + break paramLoop; + default: + ret += "?" + c; + break paramLoop; + } + } + } + if (!allowVoid && list.length === 1 && list[0] === "void") list = []; + if (rawList) { + if (ret) { + list.push(ret + "?"); + } + return list; + } else { + return ret + flushList(); + } + } + var parsed = func; + try { + if (func == "Object._main" || func == "_main") { + return "main()"; + } + // if (typeof func === "number") func = Pointer_stringify(func); + if (func[0] !== "_") return func; + if (func[1] !== "_") return func; + if (func[2] !== "Z") return func; + switch (func[3]) { + case "n": + return "operator new()"; + case "d": + return "operator delete()"; + } + parsed = parse(); + } catch (e) { + parsed += "?"; + } + if (parsed.indexOf("?") >= 0 && !hasLibcxxabi) { + // Runtime.warnOnce( + // "warning: a problem occurred in builtin C++ name demangling; build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling" + // ); + return func; + } + return parsed; +} + +function printHelp() { + console.log( + "Usage: node rewrite_exception_symbol.js \n" + ); +} + +if (process.argv.length < 4) { + printHelp(); + process.exit(0); +} + +var exceptionText = fs.readFileSync(process.argv[2], { encoding: "utf8" }); +var symbolText = fs.readFileSync(process.argv[3], { encoding: "utf8" }); + +function parseSymbol(symbolText) { + var symbolMap = new Map(); + var startLine = "var debugSymbols = {"; + var start = symbolText.indexOf(startLine); + start += startLine.length; + for (;;) { + var next = symbolText.indexOf(",", start); + var s = symbolText.substr(start, next - start).trim(); + // console.log("symbol line:", s); + var b = s.length > 0 ? s.charCodeAt(0) : 0; + if (b < 48 || b > 57) { + // not in [0-9] + break; + } + var mid = s.indexOf(":"); + if (mid < 0) { + break; + } + var left = s.substr(0, mid); + var right = s.substr(mid + 1, s.length - mid - 1); + if (right[0] === "'" && right[right.length - 1] === "'") { + right = right.substr(1, right.length - 2); + } + // console.log("symbol:", left, right); + right = demangle(right); + // console.log("after demangle:", right); + + // console.log("symbol:", start, mid, left, right); + symbolMap.set(left, right); + start = next + 1; + } + return symbolMap; +} + +var symbolMap = parseSymbol(symbolText); + +function replaceWithSymbol(src, symbolMap, regex) { + var res = src.matchAll(regex); + // console.log("to replace symbol:", src, regex); + var output = ""; + var start = 0; + for (;;) { + var d = res.next(); + if (d.value) { + var s = symbolMap.get(d.value[1]); + // console.log("to replace:", d.value, s, start); + if (s) { + output += src.substr(start, d.value.index - start); + output += s + ":wasm-function[" + d.value[1] + "]"; + } else { + output += src.substr(start, d.value.index - start); + output += d.value[0]; + } + start = d.value.index + d.value[0].length; + } + if (d.done) { + output += src.substr(start); + break; + } + } + return output; +} + +var output = replaceWithSymbol( + exceptionText, + symbolMap, + /j(\d+):wasm-function\[\d+]/g +); +output = replaceWithSymbol( + output, + symbolMap, + /:wasm-function\[(\d+)\]/g +); +console.log(output); -- GitLab