背景:今年 2 月份,本人为随时远程语音指挥家里服务器上 Coding Agent 干活需要,和前同事 librae8226 搭伙开发了远程 Agent 中继器 Nexus4cc 的开发。此后一直跟踪这个 "Agent 中继" 领域的产品,最近发现 Herdr 特别好用。
本文基于 Herdr 官方文档、官方仓库、插件市场,以及 dcolinmorgan/herdr-remote 仓库整理。资料核对时间:2026-07-02。Herdr 和周边插件仍在快速演进,具体命令和插件能力以文末链接的官方资料为准。

如果只用一句话概括 Herdr:它是一个面向 coding agent 的终端 multiplexer。它保留了 tmux/Zellij 这类工具最重要的能力:真实终端、持久会话、detach/reattach、SSH 工作流;同时补上了 agent 时代真正缺的那一层:知道哪个 agent 正在工作、哪个被权限/问题卡住、哪个已经完成,以及用 CLI/socket/API/插件把这些状态接到自动化里。

本文会沿着下面这条脉络展开:

  • 回顾终端复用器的历史:从 PTY、GNU Screen、tmux 到 Zellij,再看 Herdr 为什么会在 agent 时代出现。
  • 拆解 Herdr 的技术原理:后台 session server、真实 PTY、client attach、agent 状态识别、CLI/socket API。
  • 梳理典型使用方式:本地单项目、多 agent/worktree、SSH 远程、herdr --remote、手机审批和 herdr-remote
  • 评估 Herdr 的优势和边界:性能、体验、远程工作流、插件生态、安全和平台限制。
  • 对比同类工具:tmux/Zellij、Warp/cmux、Conductor 等工具分别适合什么场景。

image.png

1. Herdr 到底解决什么问题

先把时间拨回到 AI coding agent 之前。Unix/Linux 上所谓“终端”早就不是一根真的串口线了。今天你在 Terminal.app、iTerm2、Ghostty、SSH、tmux 或 Herdr 里看到的 shell,大多跑在 pseudo-terminal,也就是 PTY 上。PTY 有两端:一端由终端模拟器、SSH server、tmux server 或 Herdr server 这类“外壳”持有;另一端交给 shell、vim、top、Claude Code、Codex 这样的程序当作自己的控制终端。外壳往 PTY 写字节,程序就像收到了键盘输入;程序往终端输出字节,外壳就把它画到屏幕上。Ctrl-C、窗口大小变化、光标控制、全屏 TUI,其实都在这层字节流和终端语义里流动。

image.png

这也是“关掉窗口以后进程为什么会死,tmux 里为什么不会”的关键。普通终端或 SSH 断开时,拿着 PTY 外侧的那个进程也结束了,内侧的 shell/前台进程通常会收到 hangup,除非你用 nohupdisown、systemd、supervisor 之类手段绕开它。tmux、GNU Screen、Herdr 这类 multiplexer 的妙处,是把“拿着 PTY 外侧的人”从你的可见窗口里抽出来,放进一个后台 server。你关掉的只是 client;server 仍然握着那些 PTY,所以里面的进程继续以为终端还在。

tmux 本身就是这个传统的一次现代化。GNU Screen 很早就解决了 detach/reattach;tmux 由 Nicholas Marriott 在 2007 年前后开始发布,后来进入 OpenBSD base,逐渐成为很多开发者的默认终端持久化工具。它的经典价值非常朴素:一个屏幕里创建、访问、控制多个终端;detach 后后台继续运行;以后再 reattach。Herdr 站在同一条脉络上,但把对象从“多个 shell/服务”推进到“多个 coding agent”:不只是让终端活着,还要知道哪个 agent 正在工作,哪个需要批准,哪个已经完成。

image.png

图:终端复用器从会话保活、平铺布局、易用封装、极简 attach/detach,到 agent 状态感知的发展脉络。

顺着这条脉络再看 tmux 的内部结构,就能看到 Herdr 继承的是哪一层传统:后台 server 持有 PTY 和 pane,前台 client 只是接入和渲染。

image.png

图:tmux 的经典 client/server 模型:detach 时离开的只是 client,server 继续握着 pane 的 PTY。

AI coding agent 改变了终端的使用方式。以前一个终端窗口通常服务一个人:开 shell、跑测试、看日志、偶尔开 tmux 分屏。现在一个开发者可能同时启动 Claude Code、Codex、OpenCode、Pi、Cursor Agent、Droid 等多个 agent,让它们分别修 bug、写测试、做迁移、跑 review。问题随之变成:

  • 哪个 agent 还在跑,哪个已经结束?
  • 哪个 agent 需要我批准命令、回答问题、选择方案?
  • 多个仓库、多个 worktree、多个 remote server 上的 agent 怎么放在一个可扫描的视图里?
  • 断开 SSH、合上电脑、换一台终端之后,正在跑的 agent 能不能继续?
  • agent 自己能不能通过 API 创建 pane、读输出、等待另一个 agent 完成?

传统 terminal multiplexer 解决的是“进程和 pane 的持久化”,但不了解 agent 语义。GUI agent manager 解决的是“多任务和可视化状态”,但往往要求你进入一个新的桌面应用、接受它的 terminal wrapper、工作流和平台限制。Herdr 的路线是第三种:让真实终端继续是真实终端,把 agent 状态和自动化能力加在终端 multiplexer 上。

官方 README 对它的定位很直接:每个 agent 都在自己的真实终端里运行,Herdr 可以把它们汇总成 blockedworkingdoneidle 等状态;后台 server 让 panes 在 detach 后继续运行;本体是一个 Rust 二进制,不是 Electron GUI,也不要求账户或遥测。

2. 术语表:先对齐几个容易混淆的词

术语简短解释在 Herdr 里的意义
终端复用器 / terminal multiplexer在一个终端会话里管理多个终端视图,并支持 detach/reattach 的工具。tmux、GNU Screen、Zellij、Herdr 都属于这个谱系。Herdr 是面向 coding agent 的终端复用器:它不只管理 shell,还理解 agent 状态。
Terminal emulator / 终端模拟器Terminal.app、iTerm2、Ghostty、WezTerm 这类应用。它负责把字节流画成屏幕,把键盘/鼠标输入送进终端会话。Herdr 通常运行在你已有的终端模拟器里,不要求替换它。
TTYUnix 里“终端设备”的抽象。历史上来自 teletype,现在泛指进程看到的控制终端。shell、vim、agent CLI 都需要一个类似 TTY 的环境,才能正常处理输入输出和控制信号。
PTY / pseudo-terminal伪终端。它成对出现:master 端由终端模拟器、SSH、tmux、Herdr 等外壳持有;slave 端交给 shell 或程序当控制终端。Herdr server 持有 pane 的 PTY,因此 client 断开后,pane 里的进程还能继续运行。
PTY masterPTY 的外侧。谁持有 master,谁就能向程序“输入”字节,也能读取程序输出。Herdr/tmux 这类后台 server 的关键能力,就是替你持续握住 master。
PTY slavePTY 的程序侧。shell、vim、agent CLI 会把它当作自己的 stdin/stdout/stderr 和控制终端。agent 在 Herdr pane 里看到的仍然是真实终端语义,不是网页文本框。
Session / 会话一组长期存在的终端运行状态。tmux 有 session;Herdr 也有默认 session 和 named session。detach 后 session 继续在后台;再次运行 herdr 可以重新 attach。
Client / 客户端连接到后台 server 的前台界面,负责渲染和输入。你看到的 Herdr TUI 是 client;关掉 client 不等于停止 server。
Server / 后台 server持有真实资源的一侧:PTY、pane、进程状态、布局、agent 状态等。Herdr server 是持久化核心。它让 panes 和 agents 在 detach 后继续运行。
Pane / 终端窗格一个终端复用器里的可分割终端区域。注意不是 panelHerdr 的每个 pane 是一个真实终端,里面可以跑 shell、测试、服务或 agent。
Tab同一个 workspace 里的一个布局页,通常包含一组 panes。可以把 agentslogsserverreview 分成不同 tabs。
Workspace比 tab 更高一层的项目容器,适合按 repo、任务或 worktree 划分。Herdr 会把 workspace 里的 agent 状态汇总到 sidebar,方便扫描。
Attach / detachattach 是接入已有后台会话;detach 是退出前台 client,但保留后台 server 和进程。ctrl+b q detach 后,agent 继续跑;重新运行 herdr attach 回来。
Foreground process / 前台进程当前控制终端输入的进程或进程组。Herdr 会看 pane 的前台进程来识别它是不是 Claude Code、Codex 等 agent。
Agent state / agent 状态Herdr 对 agent 当前语义状态的判断,如 blockedworkingdoneidle这是 Herdr 区别于普通 terminal multiplexer 的核心:它知道哪个 agent 需要你。
Socket API程序通过本地 socket 用 JSON 请求控制 Herdr server 的接口。脚本、插件和 agent 可以读 pane、发输入、等待状态、创建 workspace。
Plugin / 插件herdr-plugin.toml 的可执行 workflow package。插件能声明 actions、events、panes、link handlers,把 Herdr 接到通知、review、手机审批等流程里。

3. 核心模型:server 拥有进程,client 只负责接入

Herdr 的基本架构是“后台 session server + 一个或多个 terminal client”。

当你在项目目录里运行:

herdr

Herdr 会启动或 attach 到默认后台 session。真正持有 shell、PTY、pane、workspace、tab、agent 状态的是 server;你看到的终端 UI 是 client。client 可以 detach,server 继续运行,pane 里的 shell、测试、dev server 和 coding agent 都不会因为你关闭终端窗口而消失。

官方 concepts 文档把结构拆成四层:

  • workspace:项目级容器,适合按 repo、任务或调查方向划分。
  • tab:workspace 里的布局,适合放 agentslogsserverreview 等视图。
  • pane:一个真实终端,Herdr 渲染输出、转发输入,并在 client detach 后保留它。
  • agent:Herdr 在 pane 里识别出的 coding agent 进程,有语义状态。

这就是 Herdr 和“普通终端里开几个 tab”的根本区别:状态不属于某个前台窗口,而属于后台 session。你可以从本地终端 attach,可以 SSH 进去 attach,也可以用 herdr --remote 从本地作为 thin client 接远端 server。

4. Agent 状态是怎么来的

Herdr 的 agent awareness 不是简单看进程名。官方 agents 文档描述了几层信号:

  1. 前台进程识别
    Herdr 先看每个 pane 当前前台进程,判断它是不是 Claude Code、Codex、OpenCode、Kimi、Droid、Cursor Agent 等已知 agent。
  2. screen manifest
    对很多 agent,Herdr 会读取 pane 底部的 live bottom-buffer screen snapshot,用 TOML manifest 匹配 UI 形态,判断当前是 workingblockeddone 还是 idle。它看的是 live bottom,不是你滚动到的历史 viewport。
  3. official integration / lifecycle hook
    对具备完整 lifecycle hook 的 agent,安装官方 integration 后,hook 上报可以成为状态权威来源。对 Codex、Claude Code、Cursor Agent CLI 等部分工具,integration 主要提供原生 session identity,用于 restore;状态仍然可能由 screen manifest 负责。
  4. custom report
    插件、脚本或自定义 hook 可以通过 pane.report_agent 上报语义状态,也可以用 pane.report_metadata 上报展示层信息,例如自定义标题或短状态。

Herdr 的 blocked 检测刻意保守:只有 live bottom-buffer 明确匹配已知审批、问题、权限 UI 时才标 blocked。新的或罕见的 prompt 形态可能先显示为 idle,直到 manifest 更新或你添加本地 override。这是一个重要设计取舍:宁愿状态提示漏报,也不因为错误识别而诱导用户或脚本对 agent 发送危险输入。

这些状态会向上汇总。一个 blocked agent 会让它所在 pane、tab、workspace 都显示需要关注;working agent 会让 workspace 看起来仍在活动;done 会保留到你查看为止。Herdr 的主工作流就是:让多个 agent 并行跑,然后只盯 sidebar,看谁需要你。

5. 持久化要分三层理解

很多人第一次接触 multiplexer 时会把“detach 后继续跑”和“重启后恢复”混成一件事。Herdr 文档把它们分得很清楚。

最强的是 live persistence。
你按 ctrl+b q detach,或直接关掉 client,server 仍在,原来的 shell、agent、测试进程都继续跑。再次运行 herdr attach 回来,看到的是同一批活进程。

server 停止后的 snapshot restore 不是活进程恢复。
如果你执行 herdr server stop,原进程就没了。下次启动时,Herdr 可以恢复 workspace、tab、pane、cwd、layout、focus 等 session 形状,但普通 shell、server、测试进程不会凭空复活。

agent session restore 是另一条路径。
部分 agent 支持自己的 resume/session 机制。Herdr 可以通过官方 integration 上报的 session reference,在 server 重启后重新启动对应 agent 并恢复其对话,例如 codex resume <id>claude --resume <id> 这类方式。它恢复的是 agent 自己的 conversation session,不是旧进程。

还有两个补充能力:

  • pane_history 可以保存 recent screen history,用于 server 重启后回放近期终端内容。默认关闭,因为终端输出可能含 secret/token。
  • --handoff 是实验性 live handoff,用于某些 update 或 remote attach 流程,目标是在替换 server 时尽量保住活进程。

所以,入门时记住一个简化原则:日常只 detach,不要 stop server;stop server 是明确要结束活进程时才做。

6. CLI、socket API 与插件系统

Herdr 不只是一个 TUI。它暴露了三层自动化表面:

CLI wrappers
Herdr CLI 会通过同一个 local socket API 和 server 通信。常用命令包括:

herdr workspace create --cwd ~/project --label api
herdr pane split --current --direction right --ratio 0.5
herdr pane run w1:p2 "npm test"
herdr pane read w1:p1 --source recent --lines 50
herdr wait agent-status w1:p1 --status done
herdr agent start reviewer --cwd ~/project --split right -- codex

Raw socket API
底层协议是 local socket 上的 newline-delimited JSON。Unix 上是 Unix domain socket,Windows beta 上是 named pipe。它支持 workspace、tab、pane、agent、worktree、events、plugins 等方法,例如 pane.readpane.send_textevents.subscribeagent.explainplugin.action.invoke

Plugins
Herdr plugin 不是受限 SDK,而是一个带 herdr-plugin.toml manifest 的可执行 workflow package。插件可以用 Bash、JavaScript、Python、Rust、Go、Lua、PowerShell 等任何本机能运行的命令实现。Herdr 负责 install/link、manifest validation、keybinding、event hook、pane entrypoint、运行时上下文和日志;插件自己负责语言、依赖、文件和持久状态。

一个插件可以声明:

  • [[actions]]:可由命令、keybinding 或 UI 调用的动作。
  • [[events]]:监听 pane.agent_status_changedworktree.created 等事件。
  • [[panes]]:打开一个插件管理的 terminal pane,例如 dashboard。
  • [[link_handlers]]:把终端里的 URL ctrl-click 路由到插件 action。

插件运行时会拿到 HERDR_BIN_PATHHERDR_SOCKET_PATHHERDR_PLUGIN_CONFIG_DIRHERDR_PLUGIN_STATE_DIRHERDR_PLUGIN_CONTEXT_JSON 等上下文。官方建议插件优先通过 HERDR_BIN_PATH 调 CLI,这样跨 Unix socket 和 Windows named pipe 更可移植。

安全上要清醒一点:Herdr plugin 是普通本机代码,不是 sandbox。安装前应该看 herdr-plugin.toml 和脚本;herdr plugin install 在交互式终端会展示 source/command preview。插件市场是按 GitHub topic herdr-plugin 自动索引的公开仓库,不是官方审核目录。

7. 典型使用方式

7.1 本地单项目:替代“一堆终端 tab”

安装后,在项目目录启动:

herdr

在 pane 里启动 agent:

codex
# 或 claude / pi / opencode / cursor-agent / droid ...

常用操作:

目标鼠标方式键盘方式
分屏右键菜单或拖拽布局ctrl+b 后按 v-
新 tab顶部 tab 区域/菜单ctrl+b 后按 c
切 workspacesidebar 点击ctrl+b 后按 w
detach关闭 client 或菜单ctrl+b 后按 q
查看全部快捷键菜单ctrl+b 后按 ?

这类场景里,Herdr 最大的价值是“不用轮询”。以前你需要挨个看 terminal tab;现在 sidebar 会告诉你哪个 pane blocked、哪个 done。

7.2 本地多 agent:workspace + worktree

如果你要让多个 agent 同时处理同一 repo 的不同任务,建议给每个任务独立 worktree,避免文件互相踩。Herdr 提供 worktree 命令,把 Git worktree 打开成正常 workspace:

herdr worktree create --branch agent/auth-refactor --label auth-refactor
herdr worktree create --branch agent/test-hardening --label test-hardening

然后在各自 workspace 中启动 agent:

herdr agent start reviewer --cwd ~/project --split right -- codex
herdr agent start docs --workspace w1 --tab w1:t1 -- claude

如果你在写脚本,可以等待 agent 状态:

herdr wait agent-status w1:p1 --status done --timeout 1800000
herdr agent read reviewer --source recent --lines 80

这让 Herdr 从“人看的 dashboard”变成“脚本和 agent 也能驱动的 runtime”。

7.3 远程方式一:SSH 到服务器后运行 Herdr

最简单的远程方式和 tmux 类似:

ssh you@server
herdr

此时 shell 在远端,Herdr server 在远端,agent 和 pane 也都在远端。你 detach 后断开 SSH,再 SSH 回去运行 herdr 就能继续。

适合:

  • 你本来就长期在远端 shell 工作。
  • 服务器上有代码、凭证、GPU 或内网资源。
  • 你用手机 SSH client 临时查看状态。
  • 你想要最少配置。

限制是:Herdr 完全运行在远端,不能读取你的本地桌面能力。比如普通 SSH + 远端 Herdr 无法直接桥接本地图片剪贴板。

7.4 远程方式二:herdr --remote thin client

另一种方式是在本地运行 client,通过 SSH 连接远端 Herdr server:

herdr --remote workbox
herdr --remote ssh://you@server:2222

这个模式里,本地 Herdr 是 thin client。它通过 SSH 启动或 attach 到远端 server,把 UI stream 回本地终端。因为 client 在本地,所以可以桥接一些本地桌面能力,例如把本地图片剪贴板复制到远端临时文件并粘贴路径。

适合:

  • 你希望远端 session 像本地 Herdr 一样使用。
  • 你要保留本地快捷键习惯。
  • 你需要本地 clipboard/image paste 这类 desktop bridge。
  • 你经常 attach 到同一批远端 host。

建议把远端写进 SSH config:

Host workbox
  HostName server.example.com
  User you
  Port 2222

之后只要:

herdr --remote workbox

需要彻底隔离 runtime 时,可以用 named session:

herdr --remote workbox --session agents

7.5 手机工作:SSH 或 herdr-remote

官方文档说得很直白:你不需要 Herdr 手机 app。装一个手机 SSH client,连到 agent 所在机器,运行 herdr,窄屏 TUI 会适配。

但如果你的核心诉求是“手机上看到哪个 agent blocked,并一键 approve”,dcolinmorgan/herdr-remote 提供了另一条路径:无需手机 SSH,靠 relay 和 Web/PWA/菜单栏/Telegram/TUI 远程监控与审批。

herdr-remote 的 README 定位是:从手机、macOS 菜单栏或 Telegram 监控并批准 Herdr agents。它的架构大致是:

  1. 本地运行 relay/herdr_relay.py,默认监听 :8375,提供 WebSocket + HTTP POST,同时开 127.0.0.1:8376 UDP 接收本机插件事件。
  2. relay 轮询 Herdr CLI:herdr pane listherdr pane readherdr pane send-textherdr pane send-keys
  3. 远端机器可以安装 dcolinmorgan/herdr-push 这类插件,把 agent event push 到 relay。
  4. Web app、macOS menu bar、Telegram bot、terminal TUI 通过 WebSocket 连接 relay。
  5. 可用 Cloudflare quick tunnel 暴露公网 URL,也可以配置 token auth。

快速试用:

git clone https://github.com/dcolinmorgan/herdr-remote
cd herdr-remote/relay
./start.sh

脚本会启动 relay,如果本机有 cloudflared,会生成一个 trycloudflare.com tunnel。然后在手机上打开 demo web app,把 WebSocket URL 填进去。

在运行 Herdr 的机器上配置 push:

herdr plugin install dcolinmorgan/herdr-push
echo "HERDR_RELAY=https://your-tunnel-url" > "$(herdr plugin config-dir herdr.push)/.env"
herdr plugin action invoke herdr.push test

herdr-remote 仓库里的截图如下:

image.png

image.png

笔者本人在办公室通过 herdr 回家里 homelab 上通过 opencode 运维下本博客实景:

image.png

在远端服务器上安装好 herdr ,然后本机配置好 $HOME/.ssh/config

Host faywang
User xxxx
HostName yyyy.cc
Port zzzz

之后 herdr --remote faywang 即可,保活/状态恢复/Agent 任务进展一目了然。

安全注意:Cloudflare quick tunnel 的 URL 会暴露 relay 入口;如果要长期使用,建议开启 HERDR_RELAY_TOKEN,并优先用稳定域名、tailnet 或其它私有网络暴露方式。

8. 新手按需求选择路径

你的需求推荐路径起手命令重点
只想让一个 agent 跑完后不丢本地 Herdrherdr 后在 pane 里运行 codex/claude学会 detach:ctrl+b q
同时跑多个 agentworkspace/tab/paneherdr pane split --current --direction right看 sidebar 的状态汇总
同一 repo 多任务并行Herdr worktreeherdr worktree create --branch agent/foo每个任务独立 checkout
agent 在远端服务器SSH 后运行 Herdrssh you@server && herdr简单、稳定、像 tmux
想从本地终端控制远端remote attachherdr --remote workbox本地 client + 远端 server
想手机上批准 blocked agentherdr-remote./relay/start.shrelay、tunnel、token
想写自动化或让 agent 控 HerdrCLI/socket APIherdr pane read ...先用 CLI,再考虑 raw socket
想扩展工作流pluginherdr plugin install owner/repo安装前看 manifest 和脚本
状态识别不准agent explain / manifestherdr agent explain <target>看 manifest source 和 matched rule

一个实用入门顺序:

  1. 先只在本地一个项目里运行 herdr
  2. 学会鼠标分屏、ctrl+b q detach、重新 herdr attach。
  3. 同时开两个 agent,观察 blocked/working/done/idle 汇总。
  4. 再尝试 herdr --remoteherdr worktree create
  5. 最后再装插件或 herdr-remote。

不要一上来就把所有高级能力都打开。Herdr 的好处不是“功能很多”,而是它的核心模型足够稳:先把 live panes 管好,再逐层加自动化。

9. Herdr 的优势

9.1 性能和开销:轻量,不替换终端

Herdr 的性能优势主要来自架构选择,而不是公开 benchmark。它是一个终端里的 Rust binary,server/client 持有真实 PTY;没有 Electron GUI,也不要求把终端 UI 放进一个桌面 app 里重画。官方 README 提到它是单个约 10MB 的 Rust binary,Linux/macOS 稳定支持,Windows 仍是 preview beta。

这带来的体验差异是:

  • full-screen TUI、agent 原生界面、ANSI 输出都还是“真实终端”。
  • 可以在普通 SSH、服务器、VPS、手机 SSH client 里工作。
  • detach/reattach 是 multiplexer 原生路径,不依赖桌面 app 是否还开着。

如果你已经有喜欢的 terminal emulator,Herdr 不要求你换掉它。

9.2 体验:从“找窗口”变成“看状态”

Herdr 最大的 UX 变化是 agent state rollup。你不需要挨个 pane 看 agent 是否卡住,workspace/sidebar 会把状态向上汇总。鼠标也不是二等公民:点击 pane/tab/workspace、拖 split border、右键菜单、拖选复制、double-click token copy 都是官方工作流的一部分;键盘 prefix 只是另一层。

对多 agent 工作来说,这个变化非常实际。你不再管理“窗口”,而是管理“需要我决策的 agent”。

9.3 远程体验:SSH 友好,还有 thin client

Herdr 同时覆盖两类远程心智:

  • ssh you@server 后运行 herdr:像 tmux,简单可靠。
  • herdr --remote <host>:本地 thin client 接远端 server,保留本地 keybinding 和部分 desktop bridge。

这让它比纯 GUI agent app 更适合“代码和凭证在服务器上”的团队,也比普通 tmux 更适合需要 agent 状态的工作流。

9.4 生态:插件是普通仓库,不是封闭商店

Herdr plugin 机制很朴素:manifest + executable commands。优点是门槛低、语言无关、能复用整套 Herdr CLI/socket surface。插件市场按 GitHub topic herdr-plugin 自动索引公开仓库;页面数据里已经能看到通知、review、file viewer、worktree、PR、token dashboard、remote/mobile 等方向。

这种生态早期会更“野生”:插件质量、维护程度、权限安全需要用户判断。但也因为没有复杂 SDK 和审核流程,社区能很快试各种 workflow。

10. 限制和风险

Herdr 不是所有问题的银弹。

首先,状态识别不是魔法。screen manifest 依赖 agent UI 形态,如果 agent 改版或出现新 prompt,可能需要远程 manifest 更新、本地 override 或官方 binary 更新。

其次,server restart 后不等于原进程复活。detach 是最强持久化;stop/restart 后主要恢复 layout,只有支持 session resume 的 agent 才能恢复 conversation。

第三,插件不 sandbox。它们是普通本机代码,能用你的权限和环境执行命令。市场 listing 不代表官方审核。

第四,Windows 是 preview beta,herdr --remote 原生 Windows client 也不是完整稳定路径。跨平台团队需要提前验证。

第五,如果你的核心需求是 PR review、diff comment、merge readiness、团队协作仪表盘,Herdr 本体不是完整 review app。它更像 live terminal runtime;review/PR 流程可以通过插件或与其它工具组合。

11. 同类竞品对比

下面不是“谁全面胜出”的排名,而是按工具中心心智来对比。

工具类别代表核心优势与 Herdr 的关键差异更适合谁
经典 terminal multiplexertmux、Zellij持久终端、分屏、detach/reattach、SSH不理解 agent 语义状态;需要自己写 hook 才能知道 blocked/done主要管理 shell、server、logs,不需要 agent dashboard
agentic terminal appWarp、cmux桌面体验、AI/agent 功能、通知、垂直 tab通常是替换 terminal 的 app;远程和 server 持久语义不同想要 polished desktop terminal/AI UX
worktree/agent workspace managerConductor、Emdash、Superset 等分支隔离、并行 agent、diff/review/PR flow工作中心是 app workspace 和 review pipeline,不是终端 multiplexer重点是从 issue 到 PR 的团队流程
process dashboard / dev stack supervisorSolo 等管理进程、健康检查、自动重启更像服务/进程编排,不是交互式 agent pane runtime主要跑 dev services,而不是 coding agent
HerdrHerdr + plugins真实终端、持久 PTY、agent 状态、SSH、CLI/socket、插件review/GUI 协作不是核心;插件生态还早期喜欢终端、远程工作、多 agent 并行、希望可脚本化

Herdr 相比 tmux/Zellij 的优势很清楚:它知道 agent 状态,也把这些状态暴露给 CLI/API。相比 Warp/cmux,它不要求换终端,也更强调 SSH 和后台 server。相比 Conductor 这类 app,Herdr 不主导 branch review 流程,但能成为 agent 实时运行层:你的 agent 可以在 Herdr pane 里跑,review/PR 工具可以在另一层处理。

实际选择建议:

  • 只要终端持久化,不关心 agent 状态:tmux/Zellij 仍然足够。
  • 想要漂亮的桌面 terminal + AI 功能:Warp/cmux 这类 app 更顺手。
  • 想要完整团队化 issue 到 PR 流程:Conductor/同类 worktree manager 更聚焦。
  • 想保留现有终端和 SSH 工作流,同时管理多个 coding agent:Herdr 是更贴近问题本身的选择。
  • 可以组合使用:例如 Herdr 管 live agent panes,Conductor 或其它工具管理 review/merge 流程;或者 Herdr 跑在远端 server,手机用 herdr-remote 做审批入口。

12. 一个推荐的实战配置

如果你准备认真试 Herdr,可以按这个配置阶段推进:

第一天:纯本地

curl -fsSL https://herdr.dev/install.sh | sh
cd ~/your-project
herdr

在一个 pane 里跑 agent,在另一个 pane 跑测试或 dev server。只练三件事:split、看 sidebar、detach/reattach。

第二阶段:多任务

herdr worktree create --branch agent/refactor-auth --label refactor-auth
herdr worktree create --branch agent/add-tests --label add-tests

每个 worktree workspace 启一个 agent。把每个任务和分支绑定起来,避免多 agent 写同一 checkout。

第三阶段:远程

先用最简单路径:

ssh workbox
herdr

确认服务器上的 agent、凭证、依赖都正常后,再试:

herdr --remote workbox

第四阶段:插件和手机审批

先浏览插件市场,挑一个你信任、需求明确的插件。安装前看 manifest。手机审批用 herdr-remote 时,先在局域网或临时 tunnel 测,确认 token/auth 和网络暴露策略后再长期使用。

13. 总结

Herdr 的关键不是“又一个终端工具”,而是它把 terminal multiplexer 的进程持久化能力,和 coding agent 时代的状态感知、事件订阅、自动化控制面放在了一起。

它适合这样的人:你愿意继续住在终端里,常在本地和远端之间切换,开始同时跑多个 agent,并且希望 agent 状态能被人和脚本共同理解。它不一定取代 GUI agent workspace,也不一定取代所有 tmux/Zellij 用法;但在“真实终端 + 多 agent + SSH + 持久会话 + 可编程”这个交叉点上,Herdr 的定位非常清晰。

参考资料

“词不达意”、“沟通无效”等问题的深层原因

“词不达意”和“沟通无效”绝非简单的“口才不好”或“情商不够”,而是由以下三个深层的符号学、心理学与认知科学原因导致的:

  1. 编码与解码的“不对等”

你以为的词,不是他以为的意。符号学认为,说话是把大脑中的意义(所指),打包成语言符号(能指)发出去;听话则是反向解码的过程。概念漏斗:你心里想的是 100%,说出来只剩 70%,对方听到的只有 50%,而真正理解的可能只有 30%。符号错位:同一个词,在不同人的“认知网络”里含义完全不同。老板说“尽快”,他的编码是“今天下班前”;你的解码是“本周五前”。这种符号的错位,直接导致了沟通无效。

  1. “认知局限”与“知识荒漠”

大脑里缺乏精准的乐高积木语言是思维的边界,你无法说出你认知之外的事情。缺乏高阶概念:很多人觉得“词不达意”,是因为大脑中缺乏精准描述现象的“高阶词汇(概念)”。这就像手里只有 3 块乐高积木,却想拼出一辆跑车。缺乏结构化思维:大脑在思考时通常是网状、发散的。如果未经训练,直接把网状的思维“平铺直叙”吐出来,语言就会变成一团没有重点的乱麻,导致听众无法捕捉核心信息。

  1. “隐性权力场”的心理防御

恐惧与焦虑锁死了表达汤质强调,每一场对话背后都暗藏着权力结构(如上下级、强弱势)。生存本能胜过表达本能:当面对权威、害怕说错话,或者极度想表现自己时,大脑的杏仁核会被激活,进入“战斗或逃跑”模式。过度自我监察:此时,你的大脑会把大量精力用于“审查”自己即将说出口的话(“这句话会不会显得我太笨?”)。这种过度的心理防御,会直接导致语言卡顿、逻辑碎裂,甚至大脑一片空白。

汤质式的“逆向破解法”

要彻底根治这些问题,不能靠背话术,而要改变底层习惯:

  • 用“事实”代替“抽象词”:少说“这个项目推进得挺好”(抽象词,易错位),多说“项目已完成第二阶段,下周一交付”(事实,高对齐)。
  • 降维表达:永远假设对方是“小白”,使用最通俗的类比。把“我们需要通过分布式架构提升系统容错率”,转化为“这就像把鸡蛋放在不同的篮子里,打碎一个还有别的”。
  • 建立“缓冲时区”:被提问时,不要立刻开口。用“这是一个很好的问题,我从三个方面来拆解”作为开场白,为大脑争取5-10秒的逻辑整理时间。

📊 职场汇报场景:破解“长话短说”与“向上说服”

  1. 结论先行框架(结构化汇报)面对老板时,先给出对方最关心的“终点线”,再用逻辑链条回溯,防止听者失去耐心。

模板:结论 + 核心原因(不超过3个) + 行动/下一步计划。

话术示例:“老板,关于A项目的进度,结论是我们可以按时交付。目前有三个保障因素:第一,核心代码已提前测试完毕;第二,客户确认了第二版设计;第三,团队本周会全员跟进。下一步我将在周五前为您提交最终版报告。”

  1. “认知对齐”汇报(减少沟通阻力)汇报方案被拒绝,通常是因为双方的“符号编码”(认知背景)不一致。

不要硬怼,先降低对方的防御心理。模板:肯定对方动机 + 引入客观事实 + 邀请共同决策。

话术示例:“我完全理解您担心这个方案会增加预算。不过根据上季度的海外数据来看,这种做法反而能降低20%的获客成本。您看我们是否可以先拿5%的预算做一个灰度测试,看看效果再决定是否全量推广?”

🤝 日常社交场景:破解“冷场尴尬”与“无效迎合”

  1. “关键词延展”聊天法(拒绝做话题终结者)很多人聊天冷场,是因为只会用“哦”、“挺好的”等封闭性词汇。正确做法是提取对方话语中的名词、动词或情绪词进行延展。场景:对方说:“我上周末去爬了泰山,累死了。”错误回应:“哈哈,泰山是挺累的。”(天聊死了)正确回应(提取“爬山/泰山”或“累”):“哇,你竟然去爬泰山了!你是夜爬看日出吗?(延展泰山特征)” 或 “你下山后腿酸了几天啊?我上次去也是缓了一周。(延展‘累’的体验)”
  2. “事实+感受”深度提问(快速拉近距离)浅层的寒暄无法建立真正的人际链接。汤质在书中提到,真正的交流需要触及内心的“概念网络”。

模板:指出一个客观事实(你观察到的) + 询问对方当时的感受/想法。

话术示例:“我注意到你最近每天都是最早到公司的(事实),感觉你最近精力特别充沛,是有什么保持高效的秘诀吗?(询问感受/经验)”

💡 核心底层提醒:别做“技巧的奴隶”汤质在书里强调,说话的本质是“权力的博弈”与“认知的投射”。在汇报时,你是在为老板降低决策成本,而不是在炫耀工作量。在社交时,你是在与对方交换心理安全感,而不是在进行才艺表演。

注:本文翻译自保罗·格雷厄姆(Paul Graham)26 年 6 月 10 日应牛津大学的学生社团邀请所做的一次演讲:https://paulgraham.com/earn.html

中文翻译

既然这里显然是“未来首相的俱乐部”(注:牛津辩论社常出英国首相),那我打算跟你们聊聊一件如果能有更多政治家理解就好了的事情:我要告诉你们,人们是如何成为亿万富翁的。我希望这不仅对打算步入政坛的人有用,你们中那些当不上首相的人,也可以去成为亿万富翁。

我之所以了解这个领域,是因为 21 年前,杰西卡(Jessica)和我共同创立了一个叫 Y Combinator(YC)的机构。如果你没听说过 YC,它介于投资公司和创业者学校之间。自 2005 年创办以来,我们已经资助了大约 6500 家公司。

创办一家成功的初创公司是成为亿万富翁最常见的方法,因此在过去的 21 年里,我实际上一直在训练人们如何成为亿万富翁。到目前为止,我们培养的人里大约有 30 位已经做到了,而且还有更多人正在路上。

所以,你可以想象上个月当听到一位美国政治家声称“不可能靠自己赚到十亿美元”时,我是多么震惊。我的感觉就像一个花样滑冰教练听到有人说“不可能做出三周半跳”一样。这当然是可能的。虽然很难,但绝对可能。

当然,她并不是说不可能“变成”亿万富翁(这显然是可能的),也不是在探讨收入与资本利得之间的区别,她不是在谈论会计层面的问题。她的意思是,如果不做坏事、不以某种方式欺诈,你就不可能变得那么富有。

几天后,我和一位我资助过的初创公司创始人聊天。像往常一样,我一见面就问她的月增长率是多少。她说:“上个月 93%。”我向她指出,这意味着她的个人净资产也在以每月 93% 的速度增长。她正在以一种惊人的速度变得富有。然而,她并没有做任何坏事。她的初创公司之所以增长如此之快,完全是因为用户热爱她所构建的产品。

她能从自身的经历中感受到那位政治家有多么错误。她没有剥削任何人。恰恰相反,她的初创公司之所以能如此疯狂地增长,是因为她和联合创始人一直在拼命工作让用户开心,结果用户不断向朋友推荐。而这就带来了指数级增长(Exponential growth)。

那天晚些时候,我在网上传播了她的案例,有人回复说:“拥有几百万资产且每月增长 93%,与成为亿万富翁之间有着天壤之别。”

我猜很多人都会同意这句话。但事实证明,这句话不仅是错的,而且错得极具启发性。

所以,我想请大家帮个忙。请拿出你们的手机,计算一个数字。我知道这看起来有点刻意,但我保证这会对你们有用。我要让你们做一遍我作为投资人最常做的计算,这段经历会让你真正明白初创公司的本质。

如果我们用最保守的方式来解读那句话,假设“几百万”指的是 2000 万,那么她的公司需要增长 500 倍才能让她成为亿万富翁。现在我们来计算一下,以每月 93% 的速度增长,需要多少个月才能增长 500 倍?

我们需要计算以 1.93 为底,500 的对数。最简单的方法是打开 Google 搜索,直接在搜索框里输入:log(500, 1.93)。如果你输对了,得到的答案大约是 9.45。

也就是说,从 2000 万资产出发,保持 93% 的月增长率,只需要 9.5 个月 就能变成亿万富翁。几百万和十亿之间,其实并没有天壤之别。它们之间只隔了九个半月。

现在你知道为什么我每次见到创始人,问的第一件事永远是他们的增长率了吧。

但我不想让人指责我使用不切实际的数字。那我们用一个更保守的增长率,看看每月增长 15% 会发生什么。这个速度一点也不罕见,我经常遇到每月增长 15% 的初创公司。

如果你的收入每月增长 15%,5 年后你会赚多少钱?我们需要计算 1.15 的 60 次方(因为 5 年是 60 个月)。在 Google 里输入:1.15^60。答案大约是 4384。

这意味着在 5 年内,你的初创公司收入将增长 4384 倍。如果你现在每个月赚 1 万美元,5 年后你每个月将赚大约 4400 万美元,也就是年收入 5.26 亿美元。到那个时候,如果你持有创始人通常持有的股份比例,你就是亿万富翁了。

在现实世界中,增长率往往会逐步放缓。一家非常成功的初创公司可能在第一年增长超过 15%,而在第五年低于 15%。但最终你到达的目标位置是差不多的。如果你在 20 岁出头开始创业,30 岁时成为亿万富翁是完全可能的。虽然很难,但绝对可能。

我之所以想让你们亲自动手计算,是因为只有这样你才能真正体会到人们为什么去创业。指数级增长就像魔法一样,它能创造出看似不可能的结果。 这也是为什么有些政治家不信任它的原因。他们不懂指数增长的数学逻辑,所以当看到别人变得在他们眼里“不可能”这么富有的时候,就主观认为这其中一定有欺诈。

但现在,通过亲自动手算账,你至少明白了要成为亿万富翁并不需要欺诈。你亲眼看到,这个公式里只有两个数字:增长率,以及 增长持续的时间。如果说不作弊就不可能赚到十亿,那么这两个数字里哪一个是靠作弊实现的?

在不作弊的情况下达到每月 15% 的增长,这绝对不是不可能,初创公司经常做到。而你能在这个速度上维持多久,取决于市场规模的大小。显然,要想增长 4000 倍,市场就必须存在至少 4000 倍的潜在需求。但你需要的也就只有这些了。试问,你怎么可能通过欺诈来扩大整个市场的规模呢?

如果你只是打算当个首相,你现在可以不用听了。我们已经证明了靠自己赚到十亿美元是可能的。因为它只取决于两个数字:一个是初创公司在不作弊的情况下经常能达到的增长率,另一个是作弊根本无法改变的市场规模。

但如果你真的想成为亿万富翁,我们应该更深入地探讨。特别是第一个数字:增长率。要实现每个月持续的增长,你必须做出非常好的东西,好到人们会主动告诉他们的朋友。事实上,这也是为什么我总是先问创始人增长率的另一个原因:它能直接反映出他们是否做对了产品。

那么,你到底该如何做出一个好到让用户向朋友推荐的产品呢?市场经济的残酷之处,也是美妙之处,在于你很难去凭空创造一个客户需要但尚未拥有的东西。一旦某个可以被满足的新需求被发现,人们就会一拥而上。因此,你必须发现一个别人还不知道的需求。

怎么做到这一点?通过自己去切身体会这种需求。

你还年轻,年轻的创始人通常应该做他们自己想要的东西。你还没有足够的经验去了解其他人需要什么。但与此同时,你自身的需求其实蕴含着极其独特的价值,因为你的需求预测了未来的需求。 你正处于人们开始使用新事物的年纪。你和你的朋友现在开始用的东西,十年后所有人都会用。既然你对他人需求的直觉通常很不准,而你自身的需求却是一个极具价值的信号,那么你通常应该倾听后一个信号:做你和你朋友想要的东西。

做你和朋友想要的东西并不意味着你必须做一个大众消费品。也许你和你的朋友是分子生物学家,发现现在可以用 DNA 做一些很酷但被其他人忽略的事情;也许你和你的朋友沉迷于无人机。这个想法最初不需要有广泛的吸引力,它真的只需要吸引你和你的朋友就行。

不要担心第二个数字——市场规模。因为你预测了未来的需求,市场自己会成长。而且你总能顺理成章地扩张到邻近的市场。你需要的只是在“未被满足的需求”这片领土上建立一个滩头阵地,并以此为据点向外扩张。

你如何获得这样一个点子?答案触及了初创公司最反直觉的特征之一。寻找绝佳创业点子的方法,恰恰是“不要去寻找创业点子”。 如果你有意识地去寻找创业点子,你会变得过于保守。你会主动砍掉那些“异类”。因为最顶级的创业点子在刚开始听起来往往非常愚蠢、毫无意义,如果你带着功利心去寻找,你第一眼就会拒绝它们。而这正是它们之前没有被别人发现的原因。

想想苹果、Facebook 或 Airbnb 在刚开始时看起来是多么糟糕的主意。能有多少人会想要属于自己的电脑?一家公司怎么可能靠让大学生在网上互相窥探隐私来赚钱?谁会愿意花钱睡在别人家地板的气垫床(Airbed)上?我们现在看到了这些想法的结局,所以很容易去“事后诸葛亮”地改写历史,但我清晰地记得,Facebook 和 Airbnb 刚出现时听起来有多么不靠谱。我们当时资助了 Airbnb,甚至当时连我们自己都觉得这个主意很烂。我们之所以资助他们,纯粹是因为我们喜欢这几位创始人。

那么,如何在不刻意寻找的情况下发现创业点子呢?通过和你的朋友一起做一些好玩的项目(Projects)。 这才是最伟大的初创公司的诞生之地。它们最初甚至根本没想过要成为一家公司,只是因为人们觉得“这东西太酷了”所以动手做出来的。苹果、谷歌、Facebook 全是这样开始的,没有一个是奔着开公司去的。

这种方法之所以奏效,原因还是我前面提到的:你在预测未来的需求。所以,如果你只是凭兴趣去做一些你觉得很酷的奇奇怪怪的东西,这些东西实际上绝对不是随机的。

这是人类潜意识比显意识知道得更多的典型案例之一。任何在你的直觉里真正觉得“做出来会很酷”的东西,都有很高的概率能演变成一个伟大的创业点子,无论它听起来多么荒诞不经。在我们 21 年前(2006年)资助的项目里,不可能有比 Justin.TV 听起来更荒诞的公司了:它当时只有一个人(Justin Kan),在脑袋侧面绑了一个摄像头,每天 24 小时直播自己身上发生的一切。但这家公司最终发展得非常好。事实上你可能听过它,只不过它后来改名了,叫 Twitch。

创办一家成功初创公司的核心在于,你要极其深刻地理解某一个用户群体,从而能分毫不差地做出他们想要的东西。如果你年轻,你可以、也应该利用这个诀窍:为你自己做东西。你了解你自己。但这只是更普适的规则的一个特例。只有极其深刻地理解用户,你才能做出他们热爱到忍不住推荐给朋友的产品;而只有这样,你才能获得让初创公司真正成功所需的指数级增长。

在这个世界上,想要变富有还有其他途径,其中有些确实需要去剥削和压榨他人。但创业是实现巨额财富最常见的方式,而如果你想创业成功,其核心秘诀不是剥削,而是共情(Empathy)。 用户真正想要什么?你做点什么能让他们的生活发生巨大的、戏剧性的改善?这种强烈的共情能力,正是我们在创始人身上寻找的特质,也是我们在被录取的创始人身上重点培养的特质。

在你的社会中,人们是如何变富有的,这是理解这个社会最重要的事情之一。你不能让自己的认知被意识形态、电影或者几个世纪前的历史教条所左右。你必须看看眼前的世界,看看现在它究竟是如何发生的。如果你自己想成为富翁,你自然会被迫去理解;所以我不太担心你们。我真正担心的是未来的首相们。你们需要记住今天的演讲。因此,我为你们把核心思想总结如下:

决定一家初创公司能做多大、从而让创始人有多富有的,只有两个数字:增长率,以及 增长持续的时间。你通过做出让用户喜爱到主动推荐的产品来获得第一个数字;你通过身处一个巨大的市场来获得第二个数字。如果你能以指数级的速度在一个大市场中成长,你的公司就会变得极具价值,而作为股东的你就会变得富有。在这个过程中,你不仅不需要去作弊,相反,只要你源源不断地让客户感到快乐,这一切就会自动发生。

💡 核心思想梳理(Summary of Core Ideas)

保罗·格雷厄姆在这篇最新的演讲稿中,用极其精简的数学和商业逻辑,反驳了“不靠欺诈无法赚到十亿”的传统政治/社会意识形态。其核心论点和干货可以梳理为以下四大支柱:

  1. 财富创造的“两因子”数学公式

格雷厄姆指出,在现代社会中,通过创业合法赚取巨额财富并不神秘,它完全由一个简单的数学模型决定,不涉及任何道德原罪:

$
创业财富
=
月增长率
×
增长持续时间(市场规模)
创业财富=月增长率×增长持续时间(市场规模)$

指数增长的魔力: 哪怕从几百万的微小身家开始,只要能保持高月增长率(如YC常见的 15% - 93%),通过 Google 搜索栏的对数和幂函数计算(如
1.15
60

4384
1.15
60
≈4384 倍),在 5 到 10 年内就能通过复利效应自动滚成十亿美元。许多人对财富的偏见,本质上是因为人类大脑对“指数增长”缺乏直观的数学理解。

  1. 增长的唯一驱动力:用户共情而非剥削

政治家常认为巨富意味着剥削,而格雷厄姆指出,初创公司的增长模型恰恰相反:

增长来自推荐: 能够保持每个月 15% 以上高增长的唯一秘诀,是产品好到让用户感动,从而发生自发的“口碑传播”(Word of Mouth)。
共情(Empathy)是核心: 创业不是掠夺,而是极致的利他与共情——深入洞察某一类人的痛苦,做出能戏剧性改善他们生活的工具。

  1. 如何获得最顶级的创业点子?

不要功利地去“寻找”点子: 带着框框去想点子会让你陷入保守,从而主动放弃那些听起来很蠢、很边缘的“异类点子”。而历史上伟大的公司(如 Apple、Facebook、Airbnb、Twitch)在 Version 1.0 时,听起来都极其荒谬和失败。
和朋友一起做“酷的项目”(Build Cool Stuff): 最好的点子往往起源于几个聪明人聚在一起,不以开公司为目的、纯粹为了好玩而做出来的玩具。

  1. 年轻创始人的“特权外挂”

年轻人缺乏商业经验,无法预测大众或传统企业的需求,但这恰恰是他们的优势:

年轻人的需求预言了未来: 年轻创始人只需要“为自己和朋友解决问题”。因为二十岁左右的年轻人是新技术的先锋消费者,你和身边的极客朋友今天在玩的酷东西,往往就是十年后全世界都在用的主流产品。你自身的需求,就是最精准的未来市场预测器。

最近发现客户端中android4.3上GS4手机上的WebApp应用特别容易crash。分析了源代码之后发现,在ActivityThread中回收内存时会调用EGLImpl里边去,回收RenderThread,进而调用到计算CPU FPS的逻辑,进而crash:

```bash
java.lang.Error: signal 11 (Address not mapped to object) at address 0xbe59dff0 [at libPowerStretch.so:0x2d4c (_ZN11LucidConfig13calcTargetFPSEi+0x1b)]

at system.lib.libPowerStretch_so.0x2d4c(LucidConfig::calcTargetFPS(int):0x1b:0)

at system.lib.libPowerStretch_so.0x2f23(LucidConfig::isLucidActive(bool):0x86:0)
```

因为在问题出在系统层而android应用回收内存这个message是ActivityManager发出,为正常且必要的行为,无法规避。最终选择如下方式将其绕过:

```java
public class H5WebViewRenderPolicy {
public static boolean shouldDisableHardwareRenderInLayer() {
// case 1: samsung GS4 on android 4.3 is know to cause crashes at libPowerStretch.so:0x2d4c
// use GT-I95xx to match more GS4 series devices though GT-I9500 is the typical device
final boolean isSamsungGs4 = android.os.Build.MODEL != null && android.os.Build.MODEL.contains("GT-I95") && android.os.Build.MANUFACTURER != null && android.os.Build.MANUFACTURER.equals("samsung");
final boolean isJbMr2 = Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN_MR2;
if (isSamsungGs4 && isJbMr2) {
return true;
}

return false;
}
}
```
以上定义一个渲染策略类(方便以后维护),针对GS4 + android 4.3这种组合在WebView layer层面关闭硬件加速(这样就不会存在RenderThread,自然也就没法触发上文的crash)。

之后在自定义WebView中利用上以上渲染策略类:

```java
final boolean meetApiLevel11 = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB;
if (H5WebViewRenderPolicy.shouldDisableHardwareRenderInLayer() && meetApiLevel11) {
final View underlyingWebView = webView.getUnderlyingWebView();
if (underlyingWebView != null && webView.getType().equals(WebViewType.SYSTEM_BUILD_IN)) {
try {
underlyingWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
} catch (Exception globalException) {
globalException.printStackTrace();
}
}
}
```

更新 2015/2/1
-------------------------------------------------------------
该现象表现在多款三星制造的搭载android 4.3系统的手机上,不仅限于GS4

异常的堆栈如下:

```java
java.lang.IllegalArgumentException: bad parameter
at org.apache.http.client.utils.URLEncodedUtils.parse(URLEncodedUtils.java:139)
at org.apache.http.client.utils.URLEncodedUtils.parse(URLEncodedUtils.java:76)
at android.webkit.AccessibilityInjector.getAxsUrlParameterValue(AccessibilityInjector.java:412)
at android.webkit.AccessibilityInjector.shouldInjectJavaScript(AccessibilityInjector.java:327)
at android.webkit.AccessibilityInjector.onPageFinished(AccessibilityInjector.java:286)
at android.webkit.WebViewClassic.onPageFinished(WebViewClassic.java:4088)
at android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:332)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4829)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
at dalvik.system.NativeStart.main(Native Method)
```
相关的google code android project里边的issue中论述如下:

"
A customer of mine running 4.1.2 just informed me that the issue is still
present! After this issue crashes my app, I have to pop up a dialog
telling them to disable all accessibility services.
Worst user experience ever, but what else can I do.
......
Fixed in an internal build, to be released in the next major release.
......
The bug doesn't occur here in 4.2.1 (Galaxy Nexus, JOP40D).
"