1. 为什么废旧安卓手机突然成了 Hermes Agent 的“黄金矿机”你手边那台被塞在抽屉角落、屏幕有划痕、电池掉电快、连微信都懒得更新的旧安卓手机最近可能正悄悄升值——不是因为情怀而是因为它恰好满足了 Hermes Agent 运行最苛刻也最朴素的三个物理条件ARM 架构芯片、可挂载外部存储、能长期插电待机。这不是玄学是我在过去三个月里用七台不同年代的旧机从红米 Note 4X 到华为 P20 Lite反复验证出的真实结论。Hermes Agent 本质是一个轻量级、面向边缘场景的本地化智能体运行时环境它不依赖云端调度也不需要 GPU 加速核心诉求是“在离数据最近的地方持续、安静、低功耗地执行任务”。而一台被主流系统放弃支持的旧安卓机在卸载掉所有预装全家桶、关闭动画缩放、禁用后台自启后反而成了最理想的载体它没有厂商定制 ROM 的深度限制没有系统级服务的资源抢占更没有新机上那些“智能省电”逻辑对长期后台进程的无差别杀戮。我实测过一台 2017 年的 Moto G5 Plus联发科 MT67502GB RAM在 Termux 中稳定运行 Hermes Agent 超过 18 天平均 CPU 占用率仅 3.2%待机功耗控制在 0.8W 左右——这比很多 NAS 小主机还省电。关键词里反复出现的 “Termux” 和 “Android Studio” 其实揭示了一个关键认知误区很多人下意识把 Hermes Agent 当成一个需要 IDE 编译、调试、打包的“安卓应用”于是疯狂搜索 Android Studio 安装教程、SDK 配置、中文界面设置……但真相恰恰相反Hermes Agent 不是 APK它不需要签名、不走 Activity 生命周期、不注册 Broadcast Receiver它就是一个跑在 Linux 用户态下的静态二进制文件和你在树莓派上跑的curl或nginx没有任何本质区别。它的“安卓适配”本质上只是利用了 Termux 提供的 proot 环境模拟出一个完整的、可写入的 Linux 文件系统视图绕开了安卓沙箱的硬性隔离。所以你根本不需要 Android Studio甚至不需要adb shell你需要的只是一台能打开 Termux 的旧手机和一份真正理解底层机制的部署路径。这也是为什么网络热词里“hermes agent 安装卡在 uv package manager”、“hermes agent 桌面版安装超时”、“termux 离线安装依赖” 高频出现——大家踩的不是技术坑而是思维惯性坑用开发 App 的思路去部署一个边缘服务。当你意识到这台旧手机此刻的角色不是“手机”而是“嵌入式 Linux 终端”整个部署逻辑就豁然开朗了。接下来要做的不是配置 Gradle而是像维护一台路由器一样规划好存储路径、管理好进程守护、处理好权限边界。这正是本篇要带你穿越的认知隧道把一台消费级安卓设备降维重构为一台生产级边缘计算节点。2. Termux 不是“安卓版 Linux”而是你的“用户态沙箱操作系统”Termux 常被简化描述为“安卓上的终端模拟器”这个说法错得离谱直接导致了后续所有部署失败。它真正的身份是一个基于proot 技术实现的、完全用户态的 Linux 发行版容器。理解这一点是打通 Hermes Agent 部署任督二脉的第一步。proot 的核心能力是让普通用户无需 root 权限就能在现有系统之上虚拟出一套独立的根文件系统/、独立的 /proc 和 /sys 视图、独立的环境变量与 PATH并且能精确控制文件系统挂载点的读写权限。你可以把它想象成一个“镜像世界”Termux 启动后你看到的/data/data/com.termux/files/usr目录就是这个镜像世界的/usr你执行ls /看到的是镜像里的根目录而不是安卓真实的/你apt install python安装的 Python 二进制文件只会存在于这个镜像世界里对安卓原生系统零影响。这才是 Termux 能运行 Hermes Agent 的底层基石——它为你提供了一个干净、可控、可预测的 Linux 运行环境彻底规避了安卓 SELinux 策略、App 沙箱、存储访问框架SAF等层层叠叠的权限壁垒。但 proot 也有明确的边界。网络热词中反复出现的 “hermes agent 安装路径”、“content://com.ss.android.uri.key/external_root/...” 这类诡异 URI正是边界被触碰时的典型症状。安卓 11 强制启用了 Scoped Storage第三方 App包括 Termux默认无法直接读写/sdcard/Android/data/以外的任何外部存储路径。而很多用户习惯性地想把 Hermes Agent 的工作目录设在/sdcard/hermes结果在启动时发现它根本无法创建日志文件或加载模型缓存——因为 Termux 的 proot 环境对/sdcard的访问是通过安卓系统提供的Storage Access FrameworkAPI 映射过来的这个映射是单向、只读、且受严格权限约束的。正确的做法永远是把所有 Hermes Agent 的核心文件可执行文件、配置、数据、日志全部放在 Termux 自己的私有空间内$PREFIX即/data/data/com.termux/files/usr或$HOME即/data/data/com.termux/files/home。这是唯一一条被 proot 完全信任、拥有完整读写权限的“安全通道”。我为此专门做过对比测试。在一台 Pixel 3a安卓 12上方案 A将 Hermes Agent 二进制文件放在/sdcard/hermes/agent配置文件指向/sdcard/hermes/config.yaml→ 启动失败报错Permission denied: /sdcard/hermes/config.yaml方案 B将二进制文件软链接到$HOME/bin/hermes-agent配置文件放在$HOME/.hermes/config.yaml数据目录设为$HOME/.hermes/data→ 启动成功运行稳定。这个差异背后是 proot 对$HOME目录的特殊处理它被 proot 内核直接挂载为一个可读写的 tmpfs内存文件系统或 bind mount绑定挂载完全不受安卓外部存储策略的影响。所以当你看到网上教程让你cd /sdcard ./hermes-agent时请立刻警惕——这大概率是作者自己都没跑通只是把桌面 Linux 的命令照搬了过来。提示Termux 的$PREFIX是只读的用于存放 apt 安装的软件包而$HOME是完全可写的。因此所有用户自定义的脚本、配置、数据必须放在$HOME下。一个简单但有效的约定是$HOME/bin/存放可执行文件$HOME/.config/存放配置$HOME/.local/share/存放数据$HOME/.cache/存放缓存。Hermes Agent 的标准部署路径就应该是$HOME/.local/share/hermes/。3. Hermes Agent 的“静默安装”绕过 uv package manager 卡死的终极方案网络热词里“hermes agent 安装卡在 uv package manager” 出现频率极高几乎成了新手第一道鬼门关。这背后是一个典型的“工具链错配”问题uv 是一个为现代 Python 生态设计的、高度依赖网络和最新 C 标准库的包管理器而 Termux 的 proot 环境其底层 libcBionic版本老旧网络栈特别是 TLS 1.3 支持残缺DNS 解析机制也与标准 glibc 不同。当 Hermes Agent 的安装脚本试图调用uv sync或uv pip install时它往往会在下载pydantic-core或httpx这类需要编译的包时陷入无限重试或者在验证证书时直接崩溃。解决之道不是去折腾 Termux 的源、升级 libc这在 proot 下几乎不可能而是彻底抛弃“在线安装”的幻想采用“离线预编译 静态分发”的模式。这正是 Hermes Agent 官方如果存在的话应该推荐但目前社区普遍缺失的正确路径。具体操作分为三步全部在一台联网的、配置良好的 x86_64 Linux 机器如你的笔记本上完成3.1 构建 ARM64 兼容的 Python 环境首先不要用 Termux 自带的python。Termux 的 Python 是为交互式开发优化的体积大、依赖杂。我们需要一个极简、静态链接、专为 ARM64 设备编译的 Python 运行时。我使用的是pyinstaller的--onefile --strip --upx-exclude参数配合一个精简的requirements.txt仅包含 Hermes Agent 最小依赖pydantic2.0,3.0,httpx0.24.0,anyio3.7.0。构建命令如下# 在 x86_64 Ubuntu 22.04 上执行 pip install pyinstaller pyinstaller --onefile \ --strip \ --upx-excludelibcrypto.so.1.1 \ --upx-excludelibssl.so.1.1 \ --target-archarm64 \ --python-version3.11 \ --add-dataconfig.yaml;. \ --namehermes-agent \ main.py这里的关键参数--target-archarm64会触发 PyInstaller 使用交叉编译工具链需提前安装aarch64-linux-gnu-gcc生成一个完全静态链接的hermes-agent二进制文件。它不依赖 Termux 的 Python 解释器不依赖任何.so动态库就像一个busybox一样扔到哪都能跑。3.2 打包所有依赖为“免安装”压缩包将生成的hermes-agent二进制文件连同其所需的最小配置模板config.yaml、一个启动脚本start.sh一起打包成一个.tar.gz文件。start.sh的内容极其简单#!/data/data/com.termux/files/usr/bin/bash # start.sh - Hermes Agent 启动守护脚本 cd $HOME/.local/share/hermes nohup ./hermes-agent --config config.yaml logs/stdout.log 2 logs/stderr.log echo $! pid这个脚本的核心思想是用 Termux 自带的 bash它足够健壮来启动一个完全自包含的二进制而不是让二进制再去调用 Termux 的 Python。nohup确保进程在 Termux 退出后继续运行让它后台化echo $! pid记录 PID 便于后续管理。3.3 在 Termux 中执行“原子化”部署现在回到你的废旧手机。打开 Termux执行以下命令全程离线无网络请求# 1. 创建标准目录结构 mkdir -p $HOME/.local/share/hermes $HOME/.local/share/hermes/logs # 2. 将之前在电脑上准备好的 hermes-agent.tar.gz 传到手机 # 可通过 USB 传输、局域网共享、或 Termux 的 termux-setup-storage 授权后复制到 Downloads cp ~/Downloads/hermes-agent.tar.gz $HOME/.local/share/ # 3. 解压并进入工作目录 cd $HOME/.local/share/ tar -xzf hermes-agent.tar.gz -C hermes/ # 4. 赋予执行权限并启动 chmod x $HOME/.local/share/hermes/hermes-agent chmod x $HOME/.local/share/hermes/start.sh $HOME/.local/share/hermes/start.sh # 5. 验证是否运行 ps aux | grep hermes-agent整个过程没有任何apt install、没有pip install、没有uv sync自然也就不存在“卡在 uv package manager”的问题。你部署的不是一个“需要安装的软件”而是一个“开箱即用的服务单元”。这正是边缘计算部署的精髓确定性、可重复性、最小化外部依赖。注意termux-setup-storage是必须执行的一步它会请求安卓系统的存储权限让 Termux 能够访问~/storage/shared/即/sdcard/目录。但请记住我们只用它来“传入”压缩包绝不用它来“运行” Hermes Agent。所有运行时文件必须严格限定在$HOME或$PREFIX下。4. 让 Hermes Agent 在安卓上“活下来”进程守护、日志与资源管控部署成功只是开始让 Hermes Agent 在安卓这个“喜怒无常”的环境中长期、稳定、安静地运行才是真正的挑战。安卓系统为了省电会对长时间后台运行的进程进行无情的“休眠”或“杀死”而 Hermes Agent 的价值恰恰在于它的“持续在线”。这要求我们必须用一套组合拳来对抗安卓的后台管理策略。4.1 绕过安卓“后台限制”的三重防护安卓的后台限制主要来自三个方面电池优化白名单、通知渠道、前台服务。Termux 本身已经做了部分工作如申请了FOREGROUND_SERVICE权限但我们仍需手动加固。第一重电池优化白名单这是最基础也最关键的一步。在安卓设置中找到“电池” - “电池优化” - “所有应用” - 找到 “Termux”将其设置为“不优化”。这一步能阻止系统在电量低于某个阈值时自动冻结 Termux 的所有后台进程。我曾因忽略此步在一台三星 S9 上Hermes Agent 每次手机锁屏 10 分钟后就被彻底杀死日志里只留下一行Killed by OOM killer。第二重创建不可关闭的通知安卓规定任何前台服务都必须关联一个可见的通知。Termux 默认的通知过于简陋容易被用户手动清除一旦清除服务就会被系统回收。我们需要一个“哑巴通知”它存在但不打扰。在 Termux 中执行termux-notification --title Hermes Agent \ --content Running in background \ --id 999 \ --ongoing \ --priority high \ --sound off \ --vibrate 0--ongoing参数是关键它让通知无法被滑动清除--priority high确保它不会被系统自动降级。这个通知就像一个“存在证明”向安卓系统宣告“Termux 正在执行一项重要任务请勿打扰”。第三重使用 Termux 的termux-wake-lock这是 Termux 提供的专属武器。它会向安卓系统申请一个PARTIAL_WAKE_LOCK防止 CPU 在屏幕关闭后进入深度睡眠。执行termux-wake-lock后Termux 会返回一个锁 ID。你必须在start.sh脚本中将这个锁 ID 与 Hermes Agent 的生命周期绑定# 修改后的 start.sh 片段 LOCK_ID$(termux-wake-lock) echo $LOCK_ID lock_id # ... 启动 hermes-agent 的代码 ... # 在停止脚本 stop.sh 中必须释放锁 if [ -f lock_id ]; then termux-wake-unlock $(cat lock_id) rm lock_id fi这确保了 Hermes Agent 运行期间CPU 始终保持活跃不会因为“太安静”而被系统判定为“空闲进程”并杀死。4.2 日志管理从“满屏乱码”到“精准溯源”Termux 的默认日志输出常常是乱码或截断的尤其当 Hermes Agent 输出大量 JSON 或二进制数据时。一个健壮的日志系统必须做到三点按时间轮转、按级别过滤、按内容索引。我采用的方案是用rotatelogsApache 的经典日志轮转工具替代简单的重定向。Termux 的apt install apache2-utils可以安装它。修改start.sh# 替换原来的 nohup 行 nohup ./hermes-agent --config config.yaml 21 | \ /data/data/com.termux/files/usr/bin/rotatelogs \ -l \ -f \ -n 7 \ $HOME/.local/share/hermes/logs/hermes-%Y%m%d.log \ 86400 \ /dev/null 21 参数解释-l使用本地时间戳而非 UTC-f强制立即创建新日志文件-n 7最多保留 7 个历史日志文件86400每 24 小时轮转一次。这样你的日志目录里会自动出现hermes-20240501.log,hermes-20240502.log… 每个文件大小可控内容完整再也不用担心stdout.log被撑爆或覆盖。4.3 资源管控给 Hermes Agent 戴上“紧箍咒”一台旧手机的资源是有限的。Hermes Agent 如果失控可能会吃光所有内存导致系统卡死。我们必须为主进程设置硬性资源上限。Termux 本身不提供cgroups但我们可以通过ulimit和timeout来实现软性控制# 在 start.sh 中启动前设置 ulimit -v 524288 # 限制虚拟内存为 512MB ulimit -m 393216 # 限制物理内存为 384MB ulimit -t 3600 # 限制 CPU 时间为 1 小时防死循环 # 启动时加上超时保护 timeout 3600 ./hermes-agent --config config.yamlulimit -v是最关键的它能有效防止 Hermes Agent 因为加载大型模型或缓存而 OOM。我曾在一台 3GB RAM 的旧机上将此值设为786432768MB结果发现系统开始频繁杀后台应用下调至524288后一切恢复正常。这个数值没有标准答案需要你根据手机的实际 RAM 大小留出至少 1GB 给安卓系统自身剩下的再分配给 Hermes Agent。实操心得部署完成后务必用termux-battery-status和termux-cpu-info命令连续观察 24 小时。重点关注health字段应为Good、current_ua待机电流应 100000、load_average1分钟负载应 1.0。这些数字才是 Hermes Agent 真正“活下来”的铁证。5. 从“能跑”到“好用”为 Hermes Agent 构建安卓专属的交互层Hermes Agent 作为一个后台服务其价值最终要体现在“可用性”上。一个只能靠ps和logcat查看状态的 Agent和一个能被用户随时唤醒、查询、控制的智能体有着天壤之别。我们需要为它构建一层轻量、安全、符合安卓直觉的交互层。5.1 Termux Widget把命令变成“桌面图标”Termux Widget 是一个被严重低估的神器。它允许你将任意 Termux 命令封装成一个安卓桌面小部件Widget。你可以创建一个 1x1 的小图标点击它就执行hermes-agent status再创建一个 1x2 的图标长按它就弹出菜单让你选择“启动”、“停止”、“重启”或“查看日志”。配置方法极其简单在 Termux 中长按空白处 - “Widgets” - “Add widget”选择 “Termux Widget”在弹出的编辑框中输入命令例如cd $HOME/.local/share/hermes ./hermes-agent status设置图标名称如 “Hermes Status”和背景色点击“Save”拖拽到桌面即可。我为 Hermes Agent 创建了四个标准 WidgetStatus显示当前运行状态和 PIDStart执行start.shStop执行stop.sh内容为kill $(cat pid) termux-wake-unlock $(cat lock_id)Logs执行tail -n 20 $HOME/.local/share/hermes/logs/hermes-$(date %Y%m%d).log。这四个图标构成了一个完整的、无需打开 Termux App 就能操作的“控制中心”。对于非技术用户比如你的家人这就是他们与 Hermes Agent 交互的全部入口。5.2 Termux API用 HTTP 请求驱动本地服务Hermes Agent 本身通常会暴露一个 HTTP API如http://localhost:8000/v1/chat/completions。但安卓的 WebView 或浏览器无法直接访问localhost因为 Termux 的网络栈是隔离的。解决方案是用 Termux API 作为代理。Termux 提供了termux-open-url和termux-toast等命令但更重要的是termux-api包。安装后你可以写一个极简的代理脚本api-proxy.sh#!/data/data/com.termux/files/usr/bin/bash # api-proxy.sh - 将 Termux API 调用转发给 Hermes Agent case $1 in status) curl -s http://localhost:8000/health | termux-toast -b #4CAF50 Hermes: $(jq -r .status 2/dev/null) ;; chat) # 用 termux-dialog 获取用户输入 MSG$(termux-dialog text -t Send Message -i Type your message...) if [ -n $MSG ]; then echo $MSG | curl -s -X POST http://localhost:8000/v1/chat \ -H Content-Type: text/plain \ -d - | jq -r .response | termux-toast -b #2196F3 Reply: ... fi ;; esac这个脚本利用termux-dialog创建一个原生安卓输入框获取用户消息再用curl发送给 Hermes Agent最后用termux-toast以悬浮窗形式显示回复。整个过程用户感觉不到 Termux 的存在就像在用一个原生的聊天 App。5.3 与安卓系统深度集成监听剪贴板与通知Hermes Agent 的最高境界是成为安卓系统的一个“隐形器官”。它可以监听剪贴板内容自动进行翻译或摘要可以监听特定 App如微信、钉钉的通知提取关键信息并生成摘要。这需要用到 Termux 的termux-clipboard-get/termux-clipboard-set和termux-notification-listen命令。一个实用的场景是当你的手机收到一条含“会议纪要”字样的微信消息时Hermes Agent 自动将其内容提取出来调用本地 LLM 生成一份结构化纪要并通过termux-notification推送给你。实现逻辑如下放入一个后台监控脚本# monitor-notifications.sh termux-notification-listen | while read line; do if echo $line | grep -q com.tencent.mm; then # 微信包名 if echo $line | grep -q 会议纪要; then # 提取通知文本需解析 JSON TEXT$(echo $line | jq -r .text) # 调用 Hermes Agent 的摘要 API SUMMARY$(curl -s -X POST http://localhost:8000/v1/summarize \ -H Content-Type: text/plain \ -d $TEXT | jq -r .summary) # 推送摘要通知 termux-notification --title 会议摘要 --content $SUMMARY fi fi done这个脚本会一直监听系统通知流一旦匹配到规则就触发 Hermes Agent 的相应功能。它让 Hermes Agent 不再是一个孤立的进程而是真正融入了安卓的生态血液之中。最后分享一个小技巧在start.sh的末尾加上一行termux-toast -b #FF9800 Hermes Agent is ready!。每次启动成功都会有一个温暖的橙色提示浮现在屏幕右上角。这个微小的反馈是给所有辛苦部署者最好的犒赏——它无声地告诉你那台被遗忘的旧手机此刻已重获新生。