前言
在 Cocos Creator 2.x 时代,开发者 文弱书生陈皮皮 开发了一款非常好用的代码混淆插件 ccc-obfuscated-code,基于 javascript-obfuscator 实现,能够在项目构建时自动对 JS 代码进行混淆保护。
由于 Creator 3.x 的插件系统和构建管线相比 2.x 发生了很大变化,原始插件无法直接在 3.x 中使用。因此我将其迁移适配到了 Creator 3.x,在此向原作者文弱书生陈皮皮致以感谢!
迁移过程中的主要挑战
1. 构建钩子架构完全不同(最大的坑)
3.x 的构建钩子有两种模式,必须同时支持:
-
同进程模式(web 平台):构建 worker 与编辑器同进程,可以直接导出
hooks对象,函数引用不会丢失 -
跨进程模式(Android/iOS 原生平台):构建在独立的 worker 进程中运行,需要通过
configs导出文件路径字符串(而非函数对象),worker 再require()加载
如果只在 contributions.builder 文件里导出 hooks 对象,web 平台能工作,但 Android 构建会静默跳过——函数对象无法跨进程序列化,不会有任何报错,非常难排查。最终方案是同时导出两种方式:
// builder.ts
export const hooks = { onBeforeBuild, onAfterBuild }; // 同进程(web)
export const configs = { '*': { hooks: './hooks' } }; // 跨进程(native)
2. javascript-obfuscator v3 → v4 API 破坏性变更
几个选项的类型在 v4 中发生了改变:
-
stringArrayEncoding:boolean|string→string[] -
debugProtectionInterval:boolean→number -
stringArrayWrappersType:v4 中直接移除了
面板 UI 和预设文件都是按 v3 格式设计的,直接传给 v4 的 obfuscator 会报参数校验错误。解决方案是在调用 obfuscator 前通过 sanitizeOptions() 自动转换。
3. 混淆范围必须精确控制
最初让插件递归遍历构建输出目录下所有 .js 文件,结果混淆后的包完全跑不起来。对比 2.x 源码才发现,原作者只精确混淆了各 bundle 的入口 index.*.js 文件,跳过了引擎系统文件。这个细节非常关键。
4. SystemJS 模块格式兼容性
Creator 3.x 使用 Rollup + SystemJS 模块格式打包,与 javascript-obfuscator 的 stringArray 选项存在冲突,会导致运行时错误。最终强制关闭了字符串数组混淆,同时自动注入了 42 个 Cocos Creator 引擎关键名称到 reservedNames。
5. 不同平台构建输出目录结构不同
Android/iOS 原生构建的目录比 web 多一层嵌套:
Web: build/web-mobile/assets/{bundle}/index.*.js
Native: build/android/assets/assets/{bundle}/index.*.js
需要自动检测两种结构。
功能介绍
两种操作入口
| 入口 | 操作 | 适用场景 |
|------|------|---------|
| 构建任务面板 | 勾选「启用代码混淆」→ 构建 | 日常使用,最简操作 |
| 独立设置面板 | 预设管理 + 参数调整 + 导入导出 | 深度配置 |
内置混淆预设
| 预设 | 强度 | 说明 |
|------|------|------|
| 关闭 | - | 不做混淆,仅代码压缩 |
| 低强度 | ★ | 标识符短名替换 |
| 中低强度 | ★★ | + 控制台输出禁用、数字表达式化 |
| 中等强度 | ★★★ | + 控制流扁平化、死代码注入 |
| 高强度 | ★★★★ | + 全部选项启用 |
自定义预设(新功能)
支持创建/编辑/删除自定义混淆预设。内置预设只读,自定义预设独立存储,互不干扰。
核心能力
-
多平台支持:web-mobile
/ android
/ iOS 等原生平台理论兼容 -
构建面板集成:构建任务面板直接勾选启用,无需额外操作
-
独立配置面板:全部 18+ 混淆选项可视化配置
-
预设管理:内置 5 档 + 自定义预设
-
配置导出:一键导出 JSON 配置,支持 CI/CD 命令行构建
-
i18n 多语言:支持中英文界面
-
深色主题:参考 Unity Editor 暗色配色
-
引擎保护:42 个引擎标识符自动保护,跳过引擎内部 bundle
-
分包支持:
assets/各 bundle 和subpackages/分包全覆盖
安装使用
-
将
ccc-obfuscated-code-3x放入项目的extensions/目录 -
执行
npm install && npm run build -
Creator 编辑器:扩展 → 扩展管理器 → 刷新 → 启用插件
-
构建时勾选「启用代码混淆」即可。需要自定义配置可打开独立设置面板
CI/CD 自动化
# 在编辑器中导出配置后
cp ./ccc-obfuscated-code-export.json ./local/ccc-obfuscated-code.json
cc build -p android --config config.json
注意事项
本项目已在 web-mobile 和 android 平台完成验证。iOS 等平台理论兼容但未实测。如有问题欢迎提 Issue。
开源地址
GitHub:https://github.com/firekula/ccc-obfuscated-code-3x
2.x 原始项目(by 文弱书生陈皮皮):https://gitee.com/ichenpipi/ccc-obfuscated-code
感谢原作者文弱书生陈皮皮的出色工作,使得这次迁移能够站在巨人的肩膀上完成。
本项目已在 web-mobile 和 android 平台完成验证。iOS 等平台理论兼容但未实测。如有问题欢迎提 Issue。