这篇是一次真实折腾记录:在 Android 手机上,通过 Termux 部署 Codex CLI。(不是在手机端连接电脑端的Codex)
目标很简单:离开电脑以后,手机也能直接跑 Codex,能问答、改文件、执行命令、做小项目,尽量接近电脑端 CLI 的使用体验。
我把入口拆成了两套:
sh
codex / codex-cli # 手机日常入口:非流式,避免 Reconnectingcodex-raw / codex-cli-raw # 官方原版入口:流式,保留用于排查
为什么要这样拆?
因为手机网络和部分兼容网关对长连接不一定稳定。官方 CLI 默认走流式 Responses 请求,网络一抖就容易出现:
所以我的处理方式是:官方原版不删,保留成 codex-raw;日常使用则走自己封装的非流式入口 codex。
◆准备条件
你需要准备这些东西:
- OpenAI API Key,或者自己的 OpenAI 兼容网关
这篇教程用到的版本是:
text
@openai/codex@0.130.0
后面命令里的版本号也都按这个版本写。如果你要换成别的版本,要同步修改 npm 包版本和 linux-arm64 二进制包地址。
◆1. 安装 Termux 基础环境
先在 Termux 里更新包索引,并安装基础工具:
sh
pkg updatepkg install -y nodejs python git ripgrep make clang curl unzip tar
装完以后,确认这些工具都能正常执行:
sh
node -vnpm -vpython --versiongit --versionrg --version
这里不只是走个形式。后面 Codex 会依赖 Node,非流式入口会用到 Python,日常让 Codex 改文件、搜代码、跑构建时也会用到 git、rg、make、clang 这些工具。
◆2. 安装 Codex npm 包
继续在 Termux 里执行:
sh
npm install -g @openai/codex@0.130.0
正常电脑环境里,这一步通常就够了。
但在 Android + Termux 里,有一个坑:Node 识别出来的平台是 Android/arm64,而 Codex 官方可选二进制包是 Linux/arm64。npm 有时不会自动装对应的 Linux ARM64 包,所以后面要手动补一次平台二进制。
◆3. 手动补 Linux ARM64 二进制
先下载 Codex 的 Linux ARM64 包:
sh
cd "$HOME"curl -L -o codex-linux-arm64.tgz \ https://registry.npmjs.org/@openai/codex/-/codex-0.130.0-linux-arm64.tgz
然后解包:
sh
rm -rf "$HOME/.codex-linux-arm64-unpack"mkdir -p "$HOME/.codex-linux-arm64-unpack"tar -xzf codex-linux-arm64.tgz -C "$HOME/.codex-linux-arm64-unpack"
把解出来的平台包复制到 Codex npm 包的 node_modules 目录里:
sh
mkdir -p "$PREFIX/lib/node_modules/@openai/codex/node_modules/@openai/codex-linux-arm64"cp -af "$HOME/.codex-linux-arm64-unpack/package/." \ "$PREFIX/lib/node_modules/@openai/codex/node_modules/@openai/codex-linux-arm64/"
最后给 Codex 二进制和自带的 rg 加执行权限:
sh
chmod +x "$PREFIX/lib/node_modules/@openai/codex/node_modules/@openai/codex-linux-arm64/vendor/aarch64-unknown-linux-musl/codex/codex"chmod +x "$PREFIX/lib/node_modules/@openai/codex/node_modules/@openai/codex-linux-arm64/vendor/aarch64-unknown-linux-musl/path/rg"
这一段是手机部署里最容易漏的步骤。只装 npm 包但不补 Linux ARM64 二进制,后面很可能会出现命令找不到、平台包缺失之类的问题。
◆4. 配置 Codex 鉴权
先创建 Codex 配置目录,并限制权限:
sh
mkdir -p "$HOME/.codex"chmod 700 "$HOME/.codex"
然后写入 API Key。
注意:下面的 替换成自己的_API_KEY 只是占位符,不要把真实 Key 写进公开文章、截图或群聊里。
sh
cat > "$HOME/.codex/auth.json" <<'EOF'{ "OPENAI_API_KEY": "替换成自己的_API_KEY"}EOFchmod 600 "$HOME/.codex/auth.json"
接着写 Codex 配置:
sh
cat > "$HOME/.codex/config.toml" <<'EOF'model_provider = "OpenAI"model = "gpt-5.5"review_model = "gpt-5.5"model_reasoning_effort = "medium"disable_response_storage = truenetwork_access = "enabled"approval_policy = "never"sandbox_mode = "danger-full-access"[model_providers.OpenAI]name = "OpenAI"base_url = "https://替换成自己的网关或官方地址"wire_api = "responses"requires_openai_auth = true[projects."/data/data/com.termux/files/home"]trust_level = "trusted"EOFchmod 600 "$HOME/.codex/config.toml"
这里有几个关键点:
base_url 可以填官方地址,也可以填自己的 OpenAI 兼容网关。wire_api = "responses"disable_response_storage = true- Termux 的 home 路径是
/data/data/com.termux/files/home,所以项目信任路径也写这里。 auth.json 和 config.toml 都用 chmod 600,避免被其他应用或脚本随便读。
◆5. 保留官方原版 CLI
官方原版 CLI 我没有覆盖,而是保留为 codex-raw:
sh
{ printf '%s\n' '#!/data/data/com.termux/files/usr/bin/sh' cat <<'EOF'export HOME="${HOME:-/data/data/com.termux/files/home}"export PREFIX="${PREFIX:-/data/data/com.termux/files/usr}"export PATH="$PREFIX/bin:/system/bin:${PATH:-}"exec "$PREFIX/bin/node" "$PREFIX/lib/node_modules/@openai/codex/bin/codex.js" "$@"EOF} > "$PREFIX/bin/codex-raw"cp "$PREFIX/bin/codex-raw" "$PREFIX/bin/codex-cli-raw"chmod 755 "$PREFIX/bin/codex-raw" "$PREFIX/bin/codex-cli-raw"
测试一下:
如果你想确认官方原版是不是能跑,可以继续用 codex-raw 做排查。
但如果手机网络或网关对流式请求不稳定,官方原版可能会反复出现:
这也是我后面要单独做非流式入口的原因。
◆6. 创建手机直连非流式入口
日常入口我命名为:
这样平时使用时,还是输入熟悉的 codex,但底层走的是非流式请求,避免手机端一直重连。
先准备目录:
然后把随教程准备的 codex_phone.py 放进去:
sh
cp codex_phone.py "$HOME/bin/codex-phone"chmod 700 "$HOME/bin/codex-phone"
这里要注意:codex_phone.py 是非流式入口的核心脚本。原始教程里没有展开这份脚本源码,所以实际部署时,你需要把这份脚本和教程一起准备好,再复制到手机的 Termux 环境里。
接着创建 codex 命令:
sh
{ printf '%s\n' '#!/data/data/com.termux/files/usr/bin/sh' cat <<'EOF'export HOME="${HOME:-/data/data/com.termux/files/home}"export PREFIX="${PREFIX:-/data/data/com.termux/files/usr}"export PATH="$HOME/bin:$PREFIX/bin:/system/bin:${PATH:-}"exec "$PREFIX/bin/python" "$HOME/bin/codex-phone" "$@"EOF} > "$PREFIX/bin/codex"cp "$PREFIX/bin/codex" "$PREFIX/bin/codex-cli"chmod 755 "$PREFIX/bin/codex" "$PREFIX/bin/codex-cli"
到这里,手机端就会有四个入口:
text
codex 日常非流式入口codex-cli 日常非流式入口别名codex-raw 官方原版流式入口codex-cli-raw 官方原版流式入口别名
◆7. 验证安装是否成功
先看版本:
sh
codex --versioncodex-cli --versioncodex-raw --version
然后跑一次最小任务:
sh
codex exec "只回复 MOBILE_OK"
期望输出:
如果这一步成功,说明至少三件事通了:
还可以再跑一个更贴近实际使用的任务:
sh
codex exec "创建一个 hello.py,输出 MOBILE_AGENT_OK,然后运行它"
这一步用来验证 Codex 是否能在 Termux 里创建文件、执行 Python,并返回运行结果。
◆8. 日常怎么用
进入交互界面:
或者:
执行一次性任务:
比如:
sh
codex exec "帮我检查当前目录下这个 Python 脚本的问题,并直接修复"
交互界面里常用这些命令:
text
/pwd 查看当前目录/cd DIR 切换目录/clear 清空上下文/exit 退出!ls -la 手动执行 shell 命令
我建议手机端优先处理边界清晰的小任务,比如:
这种任务在手机上很顺手。
◆9. 手机端能做什么,不能做什么
部署完成后,手机端可以做这些事:
- 运行 Python、Node、npm、git、rg、make、clang
但它不是“手机系统控制器”,不要期待它直接做到这些事:
- 完全复刻官方二进制内部的原版全屏 TUI,同时又保证不重连
它更像是把一个轻量开发环境装进手机里:只要任务发生在 Termux 和文件系统里,它就很有用。
◆常见问题
1. 原版 Codex 为什么会 Reconnecting?
官方 CLI 走流式 Responses 请求。
手机网络不稳定,或者某些网关对长连接支持不好时,流式请求会断,CLI 就会自动重连,于是你会看到:
我的解决方式是:保留官方原版为 codex-raw,用于排查;日常用 codex / codex-cli 走非流式直连。
2. 为什么要手动补 linux-arm64 包?
因为 Termux 里的 Node 看到的是 Android/arm64,而 Codex 的可选平台包是 Linux/arm64。
npm 有时会跳过这个平台包,导致只装了 JS 入口,没有装真正可执行的 Linux ARM64 二进制。所以要手动下载:
text
codex-0.130.0-linux-arm64.tgz
然后放到:
text
$PREFIX/lib/node_modules/@openai/codex/node_modules/@openai/codex-linux-arm64/
3. 如果 codex 不生效,先查哪里?
按这个顺序排查:
sh
which codexls -l "$PREFIX/bin/codex"ls -l "$HOME/bin/codex-phone"python --versioncodex --version
如果 codex-raw --version 能跑,但 codex --version 不能跑,问题大概率在 codex_phone.py 或 $PREFIX/bin/codex 这个 wrapper。
如果两个都不能跑,优先回到 npm 包和 linux-arm64 二进制安装步骤。