☰
安卓版 OpenClaw 部署实战:Termux 里跑通 glibc 与 Node.js 的完整配置
2026/10/1 15:11:03 网站建设 项目流程

1. 安卓手机跑 OpenClaw 到底卡在哪:glibc 与 Node.js 的移动端适配

OpenClaw 是一个能在本地跑起来的 AI 网关与工具管理框架,你可以把它理解成一个「住在手机里的 AI 调度中心」——它负责把模型请求、工具调用、会话状态统一管起来,再通过一个本地 Dashboard 让你在浏览器里操作。适合谁?适合手头只有一台安卓手机、又想随时随地把 AI 编码助手和网关跑起来的人,比如通勤路上想改两行配置、出差时不想背笔记本、或者单纯想折腾一下移动端运行环境的开发者。

但安卓上跑 OpenClaw 有个绕不开的坎:Android 用的是 Bionic libc,而 OpenClaw 依赖的 Node.js 官方二进制、以及一堆 Linux 工具链,都是冲着 GNU glibc 编译的。这两套 C 库的 ABI 不兼容,直接跑官方 Node.js 会报cannot execute: required file not found或者No such file or directory——明明文件就在那,系统却说找不到,本质是动态链接器路径对不上。

传统解法是装proot-distro,在里面塞一个完整的 Debian/Ubuntu。这招能用,但代价是 700MB 到 1GB 的额外空间,加上 20 到 30 分钟的配置时间,而且 proot 的根层拦截会让每个命令都慢半拍。对于存储本来就紧张的手机来说,这不太划算。

另一条路是只装 glibc 动态链接器(ld.so),不装整个发行版。思路是:把 glibc 的ld.so和配套的.so库放到 Termux 里,然后用ld.so --library-path ... node的方式去加载官方 Node.js 二进制。这样既拿到了 glibc 环境,又省掉了发行版的开销,存储占用能压到 200MB 左右,配置时间 3 到 10 分钟。本文要讲的,就是这条链路怎么一步步走通,包括 glibc 补丁、Node.js 版本切换、启动验证和报错排查。

需要提前说清楚的是:Play 商店版本的 Termux 已经停止维护,必须从 F-Droid 装。这一点很多人踩坑,装完发现pkg命令各种报错,就是因为用了旧版。另外手机系统建议 Android 10 以上,预留至少 1GB 可用空间,Wi-Fi 环境操作会舒服很多。

整个链路的核心矛盾就一句话:让一个为 glibc 编译的 Node.js,在只有 Bionic 的安卓上跑起来,同时不引入完整 Linux 发行版。下面从环境准备开始,一步步拆。

2. 前置准备:Termux 安装与 glibc 运行环境搭建

这一节解决「地基」问题。你要先有一个能用的 Termux,再把 glibc 动态链接器装进去,最后确认ld.so能正常工作。顺序不能乱,因为后面 Node.js 的加载脚本依赖这里的路径。

2.1 从 F-Droid 安装 Termux

打开手机浏览器访问f-droid.org,搜索 Termux,下载 APK 安装。安装时系统会提示「允许安装来自未知来源的应用」,同意即可。装完先别急着敲命令,进 Termux 后先做一次基础更新:

pkg update -y && pkg upgrade -y

第一次运行pkg update时,Termux 会让你选镜像源。随便选一个地理位置近的就行,国内用户选清华或中科大源速度会明显快一些。选完等它跑完,中间如果问Y/n一律Y。

接着装几个后面要用的基础工具:

pkg install -y curl wget tar xz-utils proot

这里proot是可选的,但建议装上——某些 glibc 程序在路径转换时用得上,而且体积不大。xz-utils用来解压 glibc 包,tar和wget是下载解压的标配。

2.2 安装 glibc 动态链接器

Termux 社区有一个glibc-runner包,它把 glibc 的ld.so和核心库打包好了,通过 pacman 风格的仓库分发。最省事的装法是直接用社区脚本:

curl -sL https://github.com/termux-pacman/glibc-packages/raw/main/install.sh | bash

如果这个脚本因为网络原因拉不下来,可以手动装。先建目录:

mkdir -p $PREFIX/glibc/lib mkdir -p $PREFIX/glibc/bin

然后下载 glibc 的预编译包(aarch64 架构,绝大多数安卓手机都是这个):

cd /tmp wget https://github.com/termux-pacman/glibc-packages/releases/download/glibc-2.38/glibc-aarch64.tar.xz tar -xJf glibc-aarch64.tar.xz -C $PREFIX/glibc/

解压后确认ld.so在位:

ls -l $PREFIX/glibc/lib/ld-linux-aarch64.so.1

正常应该看到这个文件存在且有可执行权限。如果没有,chmod +x补一下。

2.3 配置 ld.so 加载路径

glibc 的ld.so需要知道去哪找.so库。写一个包装脚本,把库路径固定下来:

cat > $PREFIX/bin/glibc-run << 'EOF' #!/data/data/com.termux/files/usr/bin/bash GLIBC_PREFIX="$PREFIX/glibc" exec "$GLIBC_PREFIX/lib/ld-linux-aarch64.so.1" \ --library-path "$GLIBC_PREFIX/lib:$GLIBC_PREFIX/lib/aarch64-linux-gnu:$LD_LIBRARY_PATH" \ "$@" EOF chmod +x $PREFIX/bin/glibc-run

这个glibc-run就是后面加载 Node.js 的关键。它的作用是:用 glibc 的链接器启动目标程序,并把 glibc 的库目录塞进搜索路径。你可以先拿一个简单命令验证:

glibc-run /bin/echo "glibc ok"

如果输出glibc ok,说明链接器工作正常。如果报error while loading shared libraries,多半是--library-path里的路径写错了,回去检查$PREFIX/glibc/lib下有没有对应的.so文件。

注意:$PREFIX在 Termux 里默认是/data/data/com.termux/files/usr,不要手动改成/usr,否则路径全乱。

到这里,glibc 环境就算搭好了。下一节开始装 Node.js 并把它接到这个环境上。

3. 可复制配置:Node.js 版本切换与 OpenClaw 安装

这一节是全文的技术核心。你要做三件事:下载官方 Node.js 的 linux-arm64 二进制、用ld.so包装它、然后通过 npm 装 OpenClaw。每一步都有可复制的命令和配置文件。

3.1 下载并部署 Node.js 二进制

官方 Node.js 的 linux-arm64 版本是 glibc 编译的,正好能用上刚才的glibc-run。先建目录:

mkdir -p $HOME/nodejs cd $HOME/nodejs

下载 Node.js 20 LTS(这个版本和 OpenClaw 兼容性最稳):

wget https://nodejs.org/dist/v20.11.1/node-v20.11.1-linux-arm64.tar.xz tar -xJf node-v20.11.1-linux-arm64.tar.xz --strip-components=1

解压后目录里应该有bin/node、bin/npm、lib/node_modules这些。现在用glibc-run测试一下:

glibc-run $HOME/nodejs/bin/node -v

正常输出v20.11.1。如果报Segmentation fault,说明 glibc 库版本和 Node.js 不匹配,换 Node.js 18 LTS 再试。

3.2 写 Node.js 包装脚本

直接每次敲glibc-run .../node太麻烦,写个包装脚本让node和npm命令直接可用:

cat > $PREFIX/bin/node << 'EOF' #!/data/data/com.termux/files/usr/bin/bash exec $PREFIX/bin/glibc-run $HOME/nodejs/bin/node "$@" EOF chmod +x $PREFIX/bin/node cat > $PREFIX/bin/npm << 'EOF' #!/data/data/com.termux/files/usr/bin/bash exec $PREFIX/bin/glibc-run $HOME/nodejs/bin/node $HOME/nodejs/bin/npm "$@" EOF chmod +x $PREFIX/bin/npm

验证:

node -v npm -v

两个都输出对应版本号就对了。这里有个坑:不要用patchelf去改 Node.js 二进制的 interpreter。网上有些教程教你用patchelf --set-interpreter把ld.so路径写死进二进制,这在安卓上会导致段错误,因为 patchelf 改完的 ELF 头安卓加载器不认。老老实实用包装脚本最稳。

3.3 配置 npm 与安装 OpenClaw

先设置 npm 的全局目录,避免权限问题:

npm config set prefix $HOME/.npm-global echo 'export PATH=$HOME/.npm-global/bin:$PATH' >> $HOME/.bashrc source $HOME/.bashrc

然后安装 OpenClaw。注意这里要加--ignore-scripts:

npm install -g openclaw@latest --ignore-scripts

为什么加--ignore-scripts?因为 OpenClaw 依赖的node-llama-cpp在安装后会跑一个 postinstall 脚本,试图用 cmake 从源码编译 llama.cpp。这个过程在手机上要 30 分钟以上,而且大概率因为工具链不兼容直接失败。预编译的二进制其实已经能用了,所以跳过安装后脚本是安全的。

如果你确实需要本地 LLM 推理,可以单独装预编译包:

npm install -g @node-llama-cpp/linux-arm64 --ignore-scripts

3.4 用 settings 片段固定环境变量

为了让 OpenClaw 每次启动都能找到正确的 Node.js 和 glibc 路径,把关键变量写进~/.bashrc:

cat >> $HOME/.bashrc << 'EOF' # OpenClaw on Android export NODEJS_HOME=$HOME/nodejs export PATH=$NODEJS_HOME/bin:$HOME/.npm-global/bin:$PATH export LD_LIBRARY_PATH=$PREFIX/glibc/lib:$PREFIX/glibc/lib/aarch64-linux-gnu:$LD_LIBRARY_PATH export TMPDIR=$PREFIX/tmp EOF source $HOME/.bashrc

这里的TMPDIR指向 Termux 的临时目录,因为安卓的/tmp不可写,很多程序默认往/tmp写临时文件会直接报错。LD_LIBRARY_PATH把 glibc 库路径加进去,让子进程也能找到。

如果你用的是 Claude Code 或 Cline 这类工具,它们的配置文件里需要填三件套。以 Claude Code 的settings.json为例,路径在~/.claude/settings.json:

{ "env": { "ANTHROPIC_BASE_URL": "https://taotoken.net/api", "ANTHROPIC_API_KEY": "你的Key", "ANTHROPIC_MODEL": "claude-sonnet-4-20250514" } }

Cline 的 MCP 配置在~/.config/cline/mcp_settings.json,Codex 的auth.json在~/.codex/auth.json,结构类似,核心都是 Base URL、Key、Model ID 三个字段。Base URL 统一填https://taotoken.net/api,Key 从控制台生成。

到这里配置就齐了。下一节验证整个链路能不能跑通。

4. 验证请求:启动 OpenClaw 网关与成功结果确认

配置写完不代表能跑,得实际启动一次看结果。这一节给出完整的启动流程、预期输出,以及怎么确认网关真的在工作。

4.1 初始化 OpenClaw

先跑一次 onboard,它会引导你完成初始设置:

openclaw onboard

按屏幕提示走,一般会让你选模型提供商、填 API Key、设置工作目录。如果你用 TaoToken 的 API,Base URL 填https://taotoken.net/api,Key 从控制台复制。这一步的配置会写到~/.openclaw/config.json,你可以事后打开检查:

cat ~/.openclaw/config.json

确认里面的baseUrl、apiKey、model三个字段都填对了。如果 onboard 中途报错退出,多半是 Node.js 版本或 glibc 路径问题,回上一节检查node -v和glibc-run是否正常。

4.2 启动网关

关键操作:网关必须直接在 Termux 应用里跑,不要通过 SSH 跑。因为 SSH 会话断开后,网关进程会被挂断。正确做法是在 Termux 里开一个新标签页:点底部菜单栏的汉堡图标(☰),或者从屏幕左边缘向右滑,打开侧边菜单,点「新建会话」。

在新标签页里运行:

openclaw gateway

预期输出类似:

[gateway] starting on port 18789 [gateway] dashboard available at http://127.0.0.1:18789 [gateway] model provider: taotoken [gateway] ready

看到ready就说明网关起来了。这时候网关会占住这个终端,别关它。要停止按Ctrl+C,不要按Ctrl+Z——Ctrl+Z只是把进程挂起,端口还被占着,下次启动会报EADDRINUSE。

4.3 验证请求链路

另开一个 Termux 标签页,用 curl 打一下网关的健康检查接口:

curl -s http://127.0.0.1:18789/health

正常返回{"status":"ok"}。再发一个实际的模型请求:

curl -s http://127.0.0.1:18789/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet-4-20250514", "messages": [{"role": "user", "content": "说一句你好"}] }'

如果返回里带choices数组和模型回复内容,说明整条链路通了:Termux → glibc ld.so → Node.js → OpenClaw → 模型 API。这一步成功,基本就大功告成。

4.4 用 Dashboard 确认

网关启动后,在手机浏览器访问http://127.0.0.1:18789,能看到 OpenClaw 的 Dashboard。里面有网关状态、运行时信息、工具管理几个面板。如果 Dashboard 能打开且显示网关在线,说明 WebView 层也没问题。

如果你在电脑上想连手机的 Dashboard,需要做端口转发。Termux 里装openssh,然后:

pkg install -y openssh sshd

在电脑上:

ssh -L 18789:127.0.0.1:18789 -p 8022 手机IP

然后电脑浏览器访问http://127.0.0.1:18789就能看到手机上的 Dashboard。注意这个转发只在你自己的局域网内用,别暴露到公网。

4.5 保持进程存活

安卓会在息屏后杀后台进程。要让它稳定跑,做几件事:进开发者选项,把「保持唤醒」打开;在电池优化里把 Termux 设为「不优化」;如果手机有「幽灵进程杀手」之类的省电功能,把 Termux 加白名单。这些设置做完,网关能连续跑几个小时不掉。

5. 常见报错排查:401、local proxy failed、reading choices 与 OAuth

跑不通的时候,报错信息往往很含糊。这一节把最常见的几类错误和对应解法列出来,对照着查。

5.1 401 Unauthorized

{"error":{"type":"authentication_error","message":"invalid api key"}}

这是 Key 的问题。检查三处:~/.openclaw/config.json里的apiKey字段、环境变量ANTHROPIC_API_KEY、以及你从控制台复制的 Key 有没有多余空格。TaoToken 的 Key 在控制台的 API Keys 页面生成,复制时注意别带上换行。如果 Key 确认没问题还是 401,可能是 Key 被禁用或额度用完,去控制台看一眼状态。

5.2 local proxy failed

Error: local proxy failed: connect ECONNREFUSED 127.0.0.1:7890

这个报错说明 OpenClaw 在尝试连一个本地代理端口,但那个端口没有服务。常见原因是环境变量里残留了HTTP_PROXY或HTTPS_PROXY指向了一个不存在的代理。检查:

env | grep -i proxy

如果有输出,用unset HTTP_PROXY HTTPS_PROXY清掉,或者把~/.bashrc里对应的行删掉。OpenClaw 直连 API 就行,不需要额外代理层。

5.3 reading choices 报错

TypeError: Cannot read properties of undefined (reading 'choices')

这个错误通常出现在模型返回体结构不符合预期时。原因可能是:Base URL 填错了(比如填成了https://taotoken.net而不是https://taotoken.net/api),或者 Model ID 写错了导致 API 返回了错误结构。检查config.json里的baseUrl必须是https://taotoken.net/api,model字段要和 API 支持的模型名完全一致。改完重启网关。

5.4 OAuth 相关报错

Error: OAuth token expired

如果你用的是需要 OAuth 的模型提供商,token 过期会报这个。OpenClaw 的 OAuth 凭证存在~/.openclaw/credentials.json,删掉这个文件重新跑openclaw onboard走一遍授权流程即可。如果你用的是 API Key 模式(TaoToken 就是这种),不会遇到 OAuth 问题,检查一下是不是配置里混进了 OAuth 相关的字段。

5.5 Node.js 相关报错

node: error while loading shared libraries: libstdc++.so.6: cannot open shared object file

这是 glibc 库路径没配对。确认LD_LIBRARY_PATH里包含了$PREFIX/glibc/lib和$PREFIX/glibc/lib/aarch64-linux-gnu,并且这两个目录下确实有libstdc++.so.6。如果没有,说明 glibc 包解压不完整,重新下载解压一次。

Segmentation fault

跑node -v直接段错误,多半是 Node.js 版本和 glibc 版本不兼容。换 Node.js 18 LTS 试试,或者升级 glibc 到 2.38 以上。

5.6 端口占用

Error: listen EADDRINUSE: address already in use 127.0.0.1:18789

上次网关没退干净。先找进程:

ps aux | grep openclaw

找到 PID 后kill -9 PID,或者直接pkill -f openclaw。然后重新启动网关。记住停止网关用Ctrl+C,别用Ctrl+Z。

5.7 排查通用思路

遇到没见过的报错,按这个顺序查:先看node -v和npm -v是否正常,再看glibc-run /bin/echo ok是否正常,然后看~/.openclaw/config.json的 baseUrl 和 model 字段,最后看网关日志。大部分问题出在 glibc 路径和 API 配置这两块。

6. 长期跑 OpenClaw 的实用建议与接入入口

把 OpenClaw 在安卓上跑通只是第一步,长期稳定用起来还有几个细节值得注意。

更新用oa --update。OpenClaw 装好后会带一个oa命令,oa --update能一次性更新 OpenClaw 核心、代码服务器、OpenCode、AI CLI 工具和安卓补丁。已经是最新版本的组件会跳过,没装的不会动,可以安全地反复跑。如果oa命令不可用(旧版本),用curl -sL myopenclawhub.com/update | bash && source ~/.bashrc替代。

性能预期要放平。openclaw status这类命令在手机上会比电脑慢,因为要读大量文件,而手机存储速度慢,加上安卓的安全处理有额外开销。但网关一旦跑起来就没区别了——进程驻留内存,不用反复读文件,模型响应在外部服务器处理,速度和 PC 上一样。

本地 LLM 可以试但别指望。OpenClaw 通过node-llama-cpp支持本地推理,预编译的@node-llama-cpp/linux-arm64在 glibc 环境下能加载。但实际限制很大:7B 模型 Q4 量化至少需要 2-4GB 可用内存,手机 RAM 还要和系统及其他应用分;模型文件 4GB 到 70GB,手机存储很快满;ARM 上纯 CPU 推理很慢,安卓不支持 llama.cpp 的 GPU 卸载。想玩可以试试 TinyLlama 1.1B(Q4 约 670MB),生产环境还是用云端 API。

多设备管理。如果你在多台设备上跑 OpenClaw,可以用 Dashboard Connect 工具从电脑统一管理。每台设备保存 IP、token、端口并命名,自动生成 SSH 隧道命令和 Dashboard URL。连接设置只存在浏览器 localStorage,不会上传到任何服务器。

接入入口。如果你还没生成 API Key,去控制台创建:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。Key 生成后在 API Keys 页面管理:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。完整的接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,里面有各语言 SDK 的调用示例。想先验证模型通不通,可以用模型对话页面直接测:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。如果你打算长期在手机上跑编码 Agent,Coding Plan 会更划算:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= 。

最后说个我踩过的坑:Termux 的$PREFIX路径在系统升级或 Termux 重装后可能变化,如果你换了设备或重装了 Termux,~/.bashrc里的路径要重新对一遍。另外glibc-run脚本里的$PREFIX是运行时展开的,只要 Termux 环境变量正常,一般不用改。整套配置跑通后,把~/.bashrc和~/.openclaw/config.json备份一下,换手机时能省不少事。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询