精确定位 Cocos 线上报错

欢迎关注我们的技术博客,聚焦 Cocos Creator、Flutter、React Native 跨平台开发技术实践。地址:https://oedx.github.io/

图片源自 Zoommy

在 Cocos-JS 的项目中,编译时往往采用 加密 + 压缩 的方式。最终 CocosCreator 编译出的代码文件都是无法直接阅读的,代码文件有 jsb_polyfill.jsc、project.jsc、setting.jsc。强行打开如下图:

应用上线后,如有线上 JS 报错,很多情况也是无法直接定位到问题的,错误中指明的只有在 jsb_polyfill.js 文件的多少行有问题,而无法还原到实际的代码文件。比如:


对于此类问题,可以通过 Cocos-JS 加解密工具来帮助我们更加精确的定位问题,其代码地址为 cocos-jsc-endecryptor

使用 Cocos-JS 加解密工具来定位问题代码行

这里以线下 Cocos 编译的 project.jsc 为例

  1. 把上述工具的代码拉到本地

  2. 终端执行如下命令即可将加密编译出的代码文件反编译出来,以 project.jsc 文件为例,你需要替换括号中内容为你实际的路径和密钥:

    {PATH}/cocos-jsc-endecryptor/edc.py decrypt -k {COCOS_PROJECT_ENCRYT_KEY} -p {COCOS_PROJECT_PATH}/build/jsb-default/src/project.jsc
    

    你也可以在 VSCode 中配置一项任务,之后直接在 VSCode 中运行该任务即可编译出 project.jsc 来定位问题:

    {
        "label": "decryABCmouse",
        "group": {
            "kind": "build",
            "isDefault": true
        },
        "type": "shell",
        "command": "{PATH}/cocos-jsc-endecryptor/edc.py decrypt -k {COCOS_PROJECT_ENCRYT_KEY} -p {COCOS_PROJECT_PATH}/build/jsb-default/src/project.jsc ; open {COCOS_PROJECT_PATH}/decryptOutput"
    }
    

    注:VS Code 中配置任务可以在 Cmd + Shift + P 呼出命令面板后,输入 tasks configure task,然后根据提示新增任务,之后可以在命令面板输入 tasks run task,运行刚刚创建的命令。

  3. 打开 project.jsc 解密后的文件 decry.js,使用 Ctrl + G 快捷键呼出快速跳转代码行窗口,输入线上报错中的行数,如上图报错中的 16661。即可快速跳转到出错行对应的代码:


    然后即可看到具体的代码,而非乱码。之后即可根据这里更加具体的代码来定位问题:
    具体代码行

注:这里以线下 Cocos 编译的 project.jsc 为例,你也可以反编译对应的 jsb_polyfill.jsc 文件。如果是编译线上的文件,可以在对应的 apk 中找到。

欢迎关注我们的技术博客,聚焦 Cocos Creator、Flutter、React Native 跨平台开发技术实践。地址:https://oedx.github.io/

5赞

看了下你其他的文章,写得很好

Mark

Mark

大神,如何加载 音频的各种格式 和 视频的各种格式 资源啊 ??

MARK

如果仅仅是这个需求,其实没必要这么麻烦,ccc打包,会自动备份源码,在js backups下面

1赞

MARK

v1.93 的jsc 文件

使用 master 分支的edc.py

python edc.py decrypt -k xxxx-xxxx -p ./project.jsc

报错.
begin decrypt.
begin unzip.
error: unzip failed, please confirm zip opt and key is right.

确认一下打包的时候是否勾选了 zip压缩,没有勾选的话使用 --nozip true 参数

mark

打包的时候,没加密的js文件给备份了,不用这么弄

博客不错有啥搭建的