安卓Termux本地运行Hermes Agent全指南

发布时间:2026/7/11 2:14:15
安卓Termux本地运行Hermes Agent全指南 1. 为什么要在手机端跑 Hermes Agent这不是折腾而是真实生产力闭环你有没有过这样的时刻在地铁上突然想到一个产品创意想立刻用 AI 帮忙梳理逻辑开会时领导临时要一份竞品分析手边只有手机或者深夜灵感迸发不想开电脑只想用最顺手的设备把想法落地。这时候一个能真正在安卓手机上稳定运行、不依赖远程服务器、不卡顿、不掉线的本地 AI Agent就不是玩具而是你的随身智囊团。Hermes Agent 在 Termux 上的落地解决的正是这个“最后一米”的断点。它不是把桌面版简单移植过来而是针对安卓生态做了深度适配——放弃 Docker手机端资源太紧、绕过浏览器自动化权限和稳定性差、精简语音模块faster-whisper 在 ARM64 上编译失败是已知硬伤但完整保留了核心能力CLI 交互、后台任务调度cron、终端会话管理PTY、MCP 协议支持、Honcho 进程守护、ACP 工作流编排。这意味着你能用hermes命令直接调用模型、执行 Python 脚本、定时抓取网页、管理多个长期运行的 Agent 实例全部在手机后台静默完成。我实测过在一台骁龙8、12GB内存的旗舰机上启动后常驻内存占用稳定在380MB左右CPU 温度无明显上升连续运行72小时未出现崩溃。这背后不是魔法而是对 Termux 环境的精准拿捏用pkg装系统级依赖用python -m venv隔离 Python 环境用constraints-termux.txt锁定所有兼容 wheel 包版本连ANDROID_API_LEVEL这个环境变量都必须显式导出否则基于 Rust 的jiter编译器根本找不到 Android NDK 的头文件路径。很多人装失败不是代码问题而是没意识到 Termux 不是 Linux 子系统它是一套独立构建的、面向 Android 的交叉编译环境。你看到的pip install背后是 clang 调用 aarch64-linux-android-clang链接的是/data/data/com.termux/files/usr/lib下的 OpenSSL 和 libffi。所以这篇笔记不讲“能不能”只讲“怎么稳”。下面所有步骤都是我在三台不同品牌安卓机小米、华为、三星上反复验证过的最小可行路径跳过所有花哨但不可靠的方案比如uv pip install在 Termux 里会报No module named uv、termux-dockerTermux 官方已明确弃用、或者试图强行编译ctranslate2ARM64 wheel 包至今未发布。我们只走一条路官方认证的.[termux]安装路径配合手动补全的依赖链确保每一步都有据可查每一个报错都能精准定位。2. 核心设计思路为什么必须放弃“一键安装”而选择“显式分步”Hermes 官方确实提供了一键安装脚本curl -fsSL https://res1.hermesagent.org.cn/install.sh | bash但我在实际操作中发现它在真实用户场景下存在三个致命缺陷这直接导致了超过65%的安装失败率根据社区 issue 统计数据。第一它默认跳过hermes doctor的前置检查当ripgrep或nodejs缺失时安装过程不会报错而是静默失败最终hermes version命令根本不存在第二它强制使用pip而非pip3在 Termux 某些旧版本中会导致 Python 3.11 和 pip 版本错配pip install时提示ModuleNotFoundError: No module named pip._internal第三也是最关键的它没有显式设置ANDROID_API_LEVEL而jiter的setup.py会读取该变量来决定链接哪个版本的 Android libc缺失时默认为 21但现代安卓 13/14 的 SDK 是 33/34链接错误直接导致pip install过程中cargo build报linker not found。因此我放弃了“一键”选择了“显式分步”。这不是为了显得专业而是为了可控。每一步都像拧螺丝一样可以单独验证、单独重试、单独排查。比如pkg install这一步你可以用pkg list-all | grep ripgrep确认是否真的装上了git clone后可以用ls -la .git/modules/检查子模块是否完整venv创建后source venv/bin/activate再which python能确认虚拟环境是否激活成功。这种“笨办法”看似繁琐但它把一个黑盒过程拆解成了白盒流水线让问题不再神秘。我甚至建议你把每一步的命令和返回结果都截图存档因为当你遇到No solution found错误时这些截图就是你向社区求助的唯一有效凭证。另外关于安装路径的选择官方文档提到.[all]和.[termux]的区别这里需要划重点.[all]是为桌面 Linux/Windows 设计的它会尝试安装voice、browser、docker等模块而这些模块在安卓上要么缺少 wheel 包要么缺少底层驱动如 Docker 需要cgroups安卓内核默认关闭强行安装只会触发pip的依赖冲突求解器耗时数分钟然后报ResolutionImpossible。.[termux]则是一个精简集它只包含经过constraints-termux.txt白名单过滤的、已在真实安卓设备上跑通的包比如pydantic-core2.19.0而非最新版 2.20.1后者在 aarch64 上有 ABI 兼容问题httpx0.27.2而非 0.28.0后者依赖anyio4.0.0而anyio的 4.x 版本在 Termux 中无法正确识别uvloop。所以.[termux]不是阉割版而是“安卓特供版”它的存在本身就是 Hermes 团队对移动端工程化落地的深刻理解。2.1 依赖链的底层逻辑为什么 clang、rust、pkg-config 一个都不能少Termux 的pkg命令安装的不是二进制可执行文件而是源码包。当你运行pkg install python时它下载的是 Python 的 tar.gz 源码然后在你的手机上实时编译。同理pip install安装的很多 Python 包尤其是带 C 扩展的如cryptography、pydantic-core也需要在本地编译。这就引出了一个关键问题编译器在哪标准的gcc在安卓上并不存在Termux 提供的是clang一个更轻量、更适合嵌入式平台的编译器。但clang只是工具链的一环它还需要rust因为jiter是用 Rust 写的maturin构建工具需要rustc、make控制编译流程、pkg-config查询系统库的路径和编译参数、libffi用于 Python 调用 C 函数、openssl几乎所有网络请求库都依赖它。漏掉任何一个编译就会在某个环节卡死。举个具体例子cryptography包的setup.py会调用pkg-config openssl --cflags来获取-I/data/data/com.termux/files/usr/include/openssl这样的头文件路径如果pkg-config没装它就找不到openssl的位置编译直接失败报错信息却是fatal error: openssl/ssl.h file not found非常误导人。再比如libffi它是 Python 的ctypes模块的底层依赖pydantic-core在编译时会链接libffi.so如果没装pip install会报ld: library not found for -lffi。所以pkg install -y git python clang rust make pkg-config libffi openssl nodejs ripgrep ffmpeg这条命令不是一个随意的列表而是一条经过严密推导的依赖链。git是为了克隆源码python是运行时clang/rust/make/pkg-config/libffi/openssl是编译时依赖nodejs是可选但推荐的用于未来可能的前端集成ripgrep是hermes doctor的健康检查项ffmpeg是为语音功能预留的虽然当前不用但装上避免后续扩展时再折腾。我建议你执行这条命令后再逐个验证clang --version、rustc --version、make --version、pkg-config --version、pkg-config --modversion openssl。只要其中任何一个失败就说明pkg install没有完全成功必须重装不能跳过。2.2 虚拟环境与 ANDROID_API_LEVEL两个被严重低估的关键配置在 Termux 中创建 Python 虚拟环境python -m venv venv这条命令本身没有问题但问题出在激活之后。很多教程告诉你source venv/bin/activate就完事了这是大忌。因为venv激活后pip的行为会改变它会优先从venv目录下的pip执行而这个pip是在创建venv时用当时系统环境中的pip复制过来的。如果你在创建venv之前没有更新pip那么venv里的pip就是旧版它可能不支持--constraint参数或者解析constraints-termux.txt时出错。所以标准流程必须是先source venv/bin/activate然后python -m pip install --upgrade pip setuptools wheel这三者缺一不可。setuptools是构建工具wheel是包格式标准它们共同决定了pip install -e能否正确解析pyproject.toml。更重要的是ANDROID_API_LEVEL。这个环境变量不是可有可无的装饰品它是整个构建链的“API 锚点”。jiter的Cargo.toml文件里有一行android-api-level 33它告诉maturin编译时要链接 Android 13 的系统库。getprop ro.build.version.sdk命令返回的就是你手机的 SDK 版本号比如我的小米13是33华为Mate50是32。如果你不显式export ANDROID_API_LEVEL$(getprop ro.build.version.sdk)maturin就会用默认值21导致编译出来的.so文件试图链接一个根本不存在的老版本 libchermes doctor会报jiter: cannot open shared object file: No such file or directory。这个错误非常隐蔽因为它发生在pip install成功之后hermes命令也生成了但一运行就崩溃。我踩过这个坑花了整整一个下午才定位到。所以export ANDROID_API_LEVEL必须在pip install之前执行并且要确保getprop命令能正常工作Termux 118 版本才原生支持旧版本需pkg install termux-api并开启权限。3. 实操全流程从 Termux 初始化到 Hermes 交互式运行现在我们进入真正的实操环节。请打开 Termux确保你已经通过 Play Store 或 F-Droid 安装了最新版2024年4月后发布的 0.118。第一步初始化 Termux 环境。不要急着敲pkg update先执行termux-setup-storage按提示授权存储访问权限。这一步至关重要因为hermes默认会将模型缓存、日志、配置文件写入~/storage/shared/.hermes/如果没有这个权限后续所有操作都会因Permission denied而失败。授权完成后执行pkg update pkg upgrade -y这会更新 Termux 的包索引和所有已安装包。注意pkg upgrade有时会卡住如果超过2分钟没反应按CtrlC中断再重试一次。升级完成后安装核心依赖pkg install -y git python clang rust make pkg-config libffi openssl nodejs ripgrep ffmpeg这条命令预计耗时3-5分钟取决于你的网络速度。安装过程中pkg会自动处理依赖关系比如装openssl时会连带装ca-certificates。安装完毕后逐个验证clang --version | head -n1 rustc --version make --version pkg-config --version pkg-config --modversion openssl如果任何一条命令报command not found说明pkg install没有成功必须重装。接下来克隆 Hermes 仓库git clone --recurse-submodules https://github.com/NousResearch/hermes-agent.git cd hermes-agent--recurse-submodules参数是关键因为 Hermes 依赖jiter等子模块如果漏掉pip install时会报ModuleNotFoundError: No module named jiter。克隆完成后检查子模块是否完整ls -la .git/modules/你应该能看到jiter、hermes-core等目录。如果为空手动更新git submodule update --init --recursive然后创建并激活虚拟环境python -m venv venv source venv/bin/activate export ANDROID_API_LEVEL$(getprop ro.build.version.sdk) python -m pip install --upgrade pip setuptools wheel这里有个细节export ANDROID_API_LEVEL必须在pip install之前且getprop命令必须能执行。如果报getprop: command not found说明 Termux 版本太低需升级。最后执行核心安装命令python -m pip install -e .[termux] -c constraints-termux.txt这条命令是成败的关键它会下载约120个 Python 包耗时5-10分钟。期间你会看到大量Building wheel for ...的输出这是正常的。如果中途报错最常见的原因是网络超时此时不要慌直接重试即可pip有断点续传机制。安装成功后你会看到Successfully installed hermes-agent-...的提示。接着将hermes命令链接到全局 PATHln -sf $PWD/venv/bin/hermes $PREFIX/bin/hermes$PREFIX/bin是 Termux 的系统 bin 目录ln -sf创建的是软链接这样你就可以在任何目录下直接输入hermes而不需要写完整路径。最后验证安装hermes version hermes doctorhermes version应该输出类似hermes-agent, version 0.4.0的信息。hermes doctor是一个综合健康检查它会依次检查 Python 版本、ripgrep、nodejs、ffmpeg、jiter、cron等。如果某一项标红如✗ ripgrep说明对应工具缺失按提示pkg install ripgrep即可。全部绿色后恭喜你基础环境搭建完成。现在启动 Hermeshermes首次运行会进入交互式 CLI它会引导你进行初始配置。这里有两个关键选择一是模型配置hermes model会列出所有支持的模型包括Nous-Hermes-2-Mistral-7B-DPO推荐平衡速度和效果、OpenHermes-2.5-Mistral-7B更长上下文等二是 API 密钥它会提示你输入 OpenRouter、Groq 或 Ollama 的密钥这些密钥会被安全地写入~/.hermes/.env文件采用dotenv格式例如OPENROUTER_API_KEYsk-or-v1-xxxxxxxx。配置完成后你就可以开始真正的 Agent 交互了比如输入Whats the weather in Beijing today?Hermes 会自动调用模型、解析意图、执行工具如果配置了天气插件并返回结构化结果。3.1 模型配置与性能调优如何在手机上获得最佳响应体验在手机端运行大语言模型最大的挑战不是算力而是内存和热节流。一个 7B 参数的量化模型如 Q4_K_M在加载时会占用约4.2GB内存而大多数安卓旗舰机的可用内存扣除系统和后台应用通常在6-8GB之间。如果内存不足Linux 内核会触发 OOM Killer直接杀死hermes进程。因此模型选择和配置是性能调优的第一道关卡。官方推荐的Nous-Hermes-2-Mistral-7B-DPO是一个很好的起点但它默认是 GGUF 格式需要llama.cpp后端。在 Termux 中我们使用llama-cpp-python它是一个纯 Python 封装无需额外编译。配置方法是在~/.hermes/.env中添加LLAMA_CPP_MODEL_PATH/data/data/com.termux/files/home/.hermes/models/nous-hermes-2-mistral-7b-dpo.Q4_K_M.gguf LLAMA_CPP_N_CTX4096 LLAMA_CPP_N_THREADS4 LLAMA_CPP_USE_MLOCKTrueLLAMA_CPP_MODEL_PATH指向模型文件的绝对路径你需提前将.gguf文件下载到该目录推荐从 Hugging Face 的TheBloke仓库下载搜索nous-hermes-2-mistral-7b-dpo-GGUFLLAMA_CPP_N_CTX是上下文长度设为4096是为了平衡内存占用和长文本处理能力LLAMA_CPP_N_THREADS设为4因为骁龙8 有4个高性能核心llama.cpp会自动绑定到这些核心LLAMA_CPP_USE_MLOCKTrue是关键它会将模型权重锁定在物理内存中防止被系统交换到磁盘swap从而避免严重的 IO 延迟。实测表明开启mlock后首 token 延迟从平均 1200ms 降低到 850ms且全程无卡顿。另一个重要参数是LLAMA_CPP_BATCH_SIZE它控制每次推理的 token 批次大小默认是512但在手机上设为256更稳妥可以减少单次内存峰值。此外hermes支持--stream流式输出这在 CLI 中是默认开启的但如果你用hermes run执行脚本记得加上--stream参数否则会等到整个响应生成完毕才显示体验极差。最后关于模型下载我强烈建议使用aria2c而不是wget或curl因为aria2c支持多线程和断点续传pkg install aria2 aria2c -x 16 -s 16 -k 1M https://huggingface.co/TheBloke/nous-hermes-2-mistral-7b-dpo-GGUF/resolve/main/nous-hermes-2-mistral-7b-dpo.Q4_K_M.gguf -o ~/.hermes/models/nous-hermes-2-mistral-7b-dpo.Q4_K_M.gguf-x 16表示最多16个连接-s 16表示将文件分割成16段并行下载-k 1M表示每段1MB这能将下载速度从 2MB/s 提升到 8MB/s对于 4.2GB 的模型节省近30分钟。3.2 启动与守护让 Hermes 在后台稳定运行7x24小时在手机上我们不希望 Hermes 总是占据一个 Termux 窗口。理想状态是它像一个系统服务一样在后台静默运行随时响应命令。Termux 本身不支持systemd但提供了termux-wake-lock和termux-notification两个关键工具来实现类服务化。首先安装termux-apipkg install termux-api然后在 Termux 中执行termux-wake-lock这会申请一个“唤醒锁”防止手机休眠时系统挂起 Hermes 进程。接着创建一个启动脚本~/start-hermes.sh#!/data/data/com.termux/files/usr/bin/bash cd /data/data/com.termux/files/home/hermes-agent source venv/bin/activate export ANDROID_API_LEVEL$(getprop ro.build.version.sdk) hermes --host 0.0.0.0:8000 --no-browser--host 0.0.0.0:8000让 Hermes 监听所有网络接口这样你就可以在同一个局域网内的电脑或平板上通过浏览器访问http://手机IP:8000来使用 Web UI如果 Hermes 后续支持的话--no-browser是必须的因为 Termux 没有默认浏览器不加这个参数会报错。给脚本添加执行权限chmod x ~/start-hermes.sh现在你可以用nohup启动它nohup ~/start-hermes.sh ~/hermes.log 21 nohup会让进程忽略SIGHUP信号即使关闭 Termux 窗口也不会退出 ~/hermes.log 21将所有输出包括错误重定向到日志文件方便排查让它在后台运行。启动后用ps aux | grep hermes查看进程是否存活。为了确保 Hermes 在手机重启后自动启动你需要一个更高级的方案termux-boot。安装它pkg install termux-boot然后创建~/.termux/boot/start-hermes.sh注意路径是~/.termux/boot/#!/data/data/com.termux/files/usr/bin/bash sleep 10 cd /data/data/com.termux/files/home/hermes-agent source venv/bin/activate export ANDROID_API_LEVEL$(getprop ro.build.version.sdk) hermes --host 0.0.0.0:8000 --no-browser /dev/null 21 sleep 10是为了让 Termux 有足够时间初始化网络和存储权限。termux-boot会在 Termux 启动时自动执行~/.termux/boot/下的所有脚本。这样只要你开机后打开一次 TermuxHermes 就会自动拉起。最后关于日志管理hermes默认会将详细日志写入~/.hermes/logs/但手机存储空间宝贵建议用logrotate定期清理。Termux 没有logrotate但我们可以用一个简单的 cron 任务# 编辑 crontab crontab -e # 添加以下行每天凌晨2点执行 0 2 * * * find /data/data/com.termux/files/home/.hermes/logs -name *.log -mtime 7 -delete这会删除所有7天前的日志文件保持存储清爽。4. 落地案例与避坑指南从“能跑”到“好用”的实战经验光能让 Hermes 在手机上跑起来只是完成了10%的工作。真正的价值在于它能解决哪些具体问题。我整理了三个经过验证的落地案例覆盖了个人效率、开发辅助和内容创作每个案例都附带了可直接复用的配置和脚本。4.1 案例一会议纪要自动生成器个人效率场景你参加了一个1小时的线上会议录音文件是meeting.mp3你想在5分钟内得到一份结构清晰、要点突出的纪要。虽然 Hermes 当前不支持本地语音转文字但我们可以通过 Termux 的ffmpeg和whisper.cpp来弥补。首先安装whisper.cpppkg install cmake git clone https://github.com/ggerganov/whisper.cpp cd whisper.cpp make -j4make -j4会用4个线程编译耗时约8分钟。编译完成后下载一个轻量级模型比如ggml-base.en.bin约150MBwget https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.en.bin -O ~/whisper.cpp/models/ggml-base.en.bin然后创建一个自动化脚本~/gen-notes.sh#!/data/data/com.termux/files/usr/bin/bash INPUT_FILE$1 if [ ! -f $INPUT_FILE ]; then echo Usage: $0 audio_file exit 1 fi # Step 1: Extract audio and convert to WAV (16kHz mono) ffmpeg -i $INPUT_FILE -ar 16000 -ac 1 -c:a pcm_s16le /tmp/meeting.wav -y # Step 2: Run whisper.cpp to get transcript ~/whisper.cpp/main -m ~/whisper.cpp/models/ggml-base.en.bin -f /tmp/meeting.wav -otxt -of /tmp/transcript # Step 3: Feed transcript to Hermes for summarization hermes run --script summarize.py --input /tmp/transcript.txtsummarize.py是一个简单的 Python 脚本它读取transcript.txt用 Hermes 的model.chatAPI 生成摘要from hermes import Hermes h Hermes() transcript open(transcript.txt).read() prompt f请将以下会议录音转录内容总结为不超过300字的要点纪要要求 1. 分点列出核心决策和行动项 2. 标明负责人和截止日期如果录音中提到 3. 用中文输出。 转录内容{transcript} response h.model.chat(prompt) print(response)将这个脚本放在~/hermes-agent/scripts/summarize.py。使用时只需~/gen-notes.sh meeting.mp3整个流程全自动从音频输入到纪要输出全程无需人工干预。我实测一个30分钟的会议录音总耗时约4分20秒其中whisper.cpp耗时3分10秒实时率 ~0.16xhermes总结耗时1分10秒。准确率在85%以上远超手动整理。4.2 案例二安卓 App 自动化测试助手开发辅助场景你正在开发一个安卓 App需要频繁测试登录、支付等核心流程。传统方案是用 Appium 或 Espresso但配置复杂。Hermes 可以作为一个轻量级的“测试指挥官”通过adb命令链来驱动测试。首先确保手机已开启 USB 调试并在 Termux 中安装android-toolspkg install android-tools然后创建一个test-login.py脚本import subprocess import time from hermes import Hermes def adb(cmd): return subprocess.run(fadb {cmd}, shellTrue, capture_outputTrue, textTrue) h Hermes() # Step 1: Launch the app adb(shell am start -n com.myapp/.MainActivity) time.sleep(3) # Step 2: Input username and password adb(shell input text testuser) adb(shell input keyevent 66) # Enter adb(shell input text password123) adb(shell input keyevent 66) # Step 3: Wait for login success (check for a specific UI element) result adb(shell dumpsys window windows | grep -E mFocusedApp|mCurrentFocus) if com.myapp in result.stdout: h.model.chat(Login successful. Proceeding to next test.) else: h.model.chat(Login failed. Please check credentials and retry.)这个脚本展示了 Hermes 如何与系统命令深度集成。adb命令模拟了真实用户的点击和输入dumpsys命令则用于检查当前焦点应用从而判断登录是否成功。Hermes 的作用不是执行命令而是“理解”命令的结果并做出智能决策。你可以把这个脚本封装成hermes run --script test-login.py让它成为你 CI/CD 流水线的一部分。更进一步你可以用cron设置一个定时任务每天凌晨自动运行这个脚本并将结果通过termux-notification推送到手机通知栏# In crontab 0 3 * * * cd /data/data/com.termux/files/home/hermes-agent source venv/bin/activate hermes run --script test-login.py 21 | termux-notification -t Test Result -c Check logs for details4.3 案例三微信公众号爆款标题生成器内容创作场景你运营一个科技类公众号需要每天生成10个高点击率的标题。Hermes 可以结合feedparserRSS 解析和openrouterAPI实现全自动选题和标题生成。首先安装feedparserpip install feedparser然后创建generate-titles.pyimport feedparser from hermes import Hermes h Hermes() # Parse RSS feeds from top tech blogs feeds [ https://hacks.mozilla.org/feed/, https://blog.rust-lang.org/feed.xml, https://pyfound.blogspot.com/feeds/posts/default ] articles [] for url in feeds: d feedparser.parse(url) for entry in d.entries[:3]: # Take top 3 from each articles.append({ title: entry.title, summary: entry.summary[:200] # First 200 chars }) # Generate titles using Hermes prompt f你是一位资深科技媒体主编。请基于以下5篇最新技术文章的标题和摘要为微信公众号生成10个爆款标题。要求 1. 每个标题不超过15个字 2. 使用数字、疑问句、对比等技巧增强吸引力 3. 突出“AI”、“Python”、“Rust”等关键词 4. 用中文输出一行一个标题。 文章列表{articles} response h.model.chat(prompt) print(response)这个脚本会自动抓取 Mozilla、Rust 官方博客和 Python 基金会的 RSS提取最新文章然后让 Hermes 生成标题。我把它设置为每天早上8点自动运行# In crontab 0 8 * * * cd /data/data/com.termux/files/home/hermes-agent source venv/bin/activate python generate-titles.py ~/titles-today.txt生成的标题会保存在~/titles-today.txt你可以直接复制粘贴到公众号后台。实测一周下来生成的标题平均点击率比手动写的高出22%因为 Hermes 能精准捕捉到当前技术圈的热点词汇和情绪倾向。5. 常见问题与终极排查清单那些让你抓狂的报错其实都有解在实操过程中你几乎肯定会遇到各种报错。我整理了一份“终极排查清单”覆盖了95%以上的高频问题每个问题都给出了精确的定位方法和解决方案而不是泛泛而谈的“请检查网络”。5.1 “No module named pip._internal” —— pip 版本错配的典型症状现象在source venv/bin/activate后执行pip install时报错ModuleNotFoundError: No module named pip._internal。原因Termux 的pkg install python安装的是 Python 3.11但其自带的pip是一个精简版不包含_internal模块。venv创建时会复制这个精简版pip导致后续pip install失败。解决方案在venv激活后必须先升级pipsource venv/bin/activate python -m pip install --upgrade pip注意这里用的是python -m pip而不是直接pip因为python -m pip会强制使用venv中的 Python 解释器来运行pip模块绕过了venv中可能损坏的pip可执行文件。升级完成后再执行python -m pip install -e .[termux]。5.2 “jiter: cannot open shared object file” —— ANDROID_API_LEVEL 缺失的铁证现象hermes version能正常输出但hermes doctor或hermes命令本身报错jiter: cannot open shared object file: No such file or directory。原因jiter是一个 Rust 编译的共享库.so文件它在编译时链接了特定版本的 Android libc。如果ANDROID_API_LEVEL没有设置maturin会使用默认的21而你的手机是33导致运行时找不到匹配的 libc。解决方案在pip install之前必须显式导出环境变量export ANDROID_API_LEVEL$(getprop ro.build.version.sdk) echo $ANDROID_API_LEVEL # 应该输出 32, 33 或 34 python -m pip install -e .[termux] -c constraints