Codex++是如何工作的?asar补丁+预加载注入+运行时加载三层架构完整解析

发布时间:2026/9/1 10:36:39
Codex++是如何工作的?asar补丁+预加载注入+运行时加载三层架构完整解析 Codex是如何工作的asar补丁预加载注入运行时加载三层架构完整解析【免费下载链接】codex-plusplusCodex tweak system for the Codex desktop app项目地址: https://gitcode.com/gh_mirrors/co/codex-plusplusCodex 是一个为 Codex 桌面应用打造的tweak 系统插件注入框架只需一次性对本地Codex.app打补丁就能注入自定义功能、修复 UI 问题并内置一个应用内的插件管理器——全程无需重新编译 Codex。这篇文章带你完整走一遍「asar 补丁 → 预加载注入 → 运行时加载」三层架构的工作原理看懂这个 Electron 应用是如何被安全改造的。全局速览Codex 的三层架构一览先记住这张总表后文逐层展开 层级所在位置职责核心文件① asar 补丁Codex.app/Contents/Resources/app.asar内部一次性把入口换成 loader 桩asar.ts② 预加载注入asar 内 loader 用户目录runtime/在主进程和渲染进程各挂一个钩子loader.cjs③ 运行时加载用户目录/runtime/tweaks/发现、启停、热重载插件main.ts其中「用户目录」即 macOS 上的~/Library/Application Support/codex-plusplus/、Windows 上的%APPDATA%/codex-plusplus/。补丁之外的一切runtime、插件、配置、日志都放在应用包外面这是整个架构的精髓。第一层asar 补丁——一次性的打孔操作Codex 桌面应用是典型的 Electron 应用几乎所有代码都打包在app.asar这个压缩归档里入口由归档内package.json的main字段决定。安装器做的事可以用一句话概括把入口指针从 Codex 自己的启动脚本改写成 Codex 的 loader 桩。具体流程有 5 步关键操作备份先把原始Codex.app完整备份到backup/目录随时可回滚改写入口解包 asar把package.json的main指向codex-plusplus-loader.cjs同时在__codexpp字段里记录原入口名和用户目录路径重算校验和把新 asar 头部 JSON 的 SHA-256 写回Info.plist的ElectronAsarIntegrity字段——因为 Electron 启动时会校验这个哈希不改就会拒绝启动关闭安全熔断顺手把 Electron Framework 二进制里的EnableEmbeddedAsarIntegrityValidationfuse 关掉作为双保险重新签名macOS 上用本机专属的 Codex Local Signing 身份重签应用保证 Gatekeeper 放行。这套解包 → 修改 → 重打包的核心实现在 patchAsar() 里它还会精确保留原 asar 的 unpacked 文件清单避免require找不到模块。为什么只改入口而不换整个 asarCodex 的 asar 约有 115 MB每次安装/更新都整包复制太慢而改入口只增加约 1 KB轻量且幂等。详见 docs/ARCHITECTURE.md。第二层预加载注入——让运行时抢跑在 Codex 之前启动 Codex 后Electron 读取 asar 里的main字段加载到的第一个脚本就是 loader 桩。它的代码不到百行但干了一件关键的事见 loader.cjs从package.json读回用户目录路径写入CODEX_PLUSPLUS_USER_ROOT环境变量先require用户目录下的runtime/main.jsCodex 主进程入口后require被替换下来的 Codex 原始入口。顺序很重要runtime 会在 Codex 创建任何窗口之前钩住 Electron 的 session通过session.registerPreloadScript()旧版本回退到setPreloads()见 registerPreload()把preload.js追加进每个渲染进程——注意是追加而非替换所以 Codex 自带的 preload 照常运行互不干扰。为什么选 preload 而不是直接改 React 源码docs/ARCHITECTURE.md 里解释得很直白Codex 是 Vite 打包的单 chunk 压缩产物没有任何稳定的模块注册表可挂钩字符串级改压缩代码每发一个新版就碎一次而 preload DOM 观察只依赖稳定的界面特征如[roledialog]所以大部分 Codex 更新都能直接兼容。preload 进入渲染进程后preload/index.ts会按序做四件事安装 React 全局钩子供后续遍历组件树→ 启动设置页注入器 → 向主进程 IPC 拉取插件清单并逐个start()→ 订阅插件已变更广播以支持热重载。其中最有视觉存在感的是设置页注入它监听设置页 DOM动态添加 Codex 分组注入 ⚙️ Config、☰ Tweaks、◇ Tweak Store 三个入口布局逻辑见 settings-injector.ts。从此你可以在应用内直接开关、配置每一个 tweak。第三层运行时加载——插件的发现与热重载真正干活的插件tweak全部住在用户目录的tweaks/下每个插件就是一个小文件夹my-tweak/ ├── manifest.json # 名称、版本、作用域等元数据 └── index.js # 入口暴露 start(api) / stop()主进程启动时用 discoverTweaks() 扫描该目录读manifest.json、校验合法性必须声明githubRepo等字段、定位入口文件。随后按作用域分发——main插件在主进程立即启动renderer插件由各窗口的 preload 启动。这层的几个巧思值得新手特别注意热重载main.ts 用 chokidar 盯着tweaks/目录文件改动落定后防抖 250ms 就停止旧插件、清模块缓存、重新发现并广播codexpp:tweaks-changed——保存即生效无需重启应用沙盒存储渲染进程插件没有 Node 文件系统权限读写文件走 IPC 落到各自的tweak-data/id/沙盒目录互不越界️失败隔离loader 里每个步骤都包在safe()里就算 Codex 自身崩了也会吞掉错误、放行原入口——插件系统坏了可以Codex 打不开不行应用内商店设置页的 Tweak Store 会拉取经过人工审核的插件注册表安装时锁定到审核通过的 commit插件更新只提示、绝不自动替换。下图就是商店里 Goal 插件的图标想动手写一个插件完整 API 和示例在 docs/WRITING-TWEAKS.md。为什么这样设计4 个关键取舍设计选择换来的好处只改 asar 入口1 KB而非整包替换安装/更新极快改动幂等可重放运行时放在用户目录而非应用包内迭代插件/运行时不用重跑安装器preload DOM 观察而非改 React 源码与 Codex 打包结构解耦抗版本更新setPreloads追加而非webPreferences.preload覆盖不破坏 Codex 自带 preload零冲突更新与自愈补丁被覆盖怎么办Codex 官方走 Sparkle 自动更新时新包会直接盖掉补丁——应用照常启动但插件暂时失效。别慌watcher 机制会接管系统级监视器macOS 盯app.asarWindows 登录时检查发现哈希漂移后自动执行codexplusplus repair --quiet。repair是幂等的哈希没变就直接退出变了就对新包重打补丁并刷新用户目录里的 runtime不碰你的插件代码。常用命令速查codexplusplus status查看状态、repair手动修复、safe-mode临时停用全部插件排查问题、uninstall一键还原。遇到问题先看 docs/TROUBLESHOOTING.md。写在最后一图记住整个启动链路把三层串起来Codex 的完整启动链路是这样的启动 Codex → asar 入口指向loader 桩→ loader 先加载用户目录的runtime/main.js→ runtime 给所有 session追加 preload.js并发现 tweaks → 再加载 Codex 原始入口 → 设置页被注入Tweaks 管理面板→ 插件保存即热重载一句话总结asar 补丁负责开门预加载注入负责布线运行时加载负责通电。门只在安装时开一次电却可以随手开关——这就是 Codex 用最小侵入实现完整插件体系的秘密所在。【免费下载链接】codex-plusplusCodex tweak system for the Codex desktop app项目地址: https://gitcode.com/gh_mirrors/co/codex-plusplus创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考