【AI 助力安全- 我让 Hermes 把古法 RPC 重新炼成了高并发调度平台:r0rpc 实战】此文章归类为:AI 助力安全。
RPC 没有死。
它只是从热闹处退到了角落里,继续替很多逆向、爬虫、自动化场景扛最硬的活。
这篇文章不打算写成一本说明书。
说明书讲“怎么用”,但我更想讲清楚另一件事:为什么在协议逆向越来越重、风控链路越来越长、真机环境越来越难复刻的今天,RPC 这种看起来有点“古法”的方案,反而还有生命力。
更重要的是,这次不是单纯拿 Sekiro 改一改,也不是写一个能转发请求的玩具 demo。
这次我让 Hermes 参与设计和实现了一套自己的 RPC 调度平台:r0rpc。
它有后台,有权限,有账号,有 group,有 action,有设备在线状态,有请求缓存,有成功率统计,有 WebSocket 长连接,有 Xposed demo,有 Python 模拟端,有性能压测脚本,也能一键部署。
一句话概括:
r0rpc 不是“把手机开个口子给外面调一下”。
它更像是把一批手机设备接进后端体系里,变成可管理、可观测、可压测、可扩展的 RPC 资源池。
而 Hermes 最让我震惊的地方也在这里:我不是让它补一个函数,不是让它写一段示例代码,而是把一个偏工程化、偏系统设计、偏实战落地的需求丢给它,它真的能把事情拆开、推进、验证,再持续修正。
这就很离谱。
如果你只想看结论,可以直接看这一段。
| 对比项 | 早期 Sekiro 使用体验 | r0rpc 当前实现 |
|---|---|---|
| 管理后台 | 没有完整后台界面,设备和 action 基本靠调用方自己记 | 有后台,可管理账号、group、action、设备 |
| 设备在线 | 不直观,在线状态排查成本高 | 后台能看在线设备,接口也能查 group 下在线设备 |
| 成功率统计 | 不方便沉淀 | 按设备、action、请求结果统计成功率 |
| 请求记录 | 不方便长期回看 | 请求参数和结果可缓存,默认按配置保留 |
| group 管理 | 调用时比较自由,但容易乱 | group 必须后台创建并启用,才能被 app 调用 |
| 高并发 | 中高并发下容易抖动 | 单设备压到 200-256 并发仍可用,两设备 200-400 并发更舒服 |
| 可观测性 | 弱 | 后台能看设备、请求、成功率、耗时 |
| 部署 | 自行组合 | MySQL / Redis 可 Docker,也可接外部服务 |
这不是说 Sekiro 不好。
恰恰相反,Sekiro 是这个方向里非常重要的先行者。没有它,很多人甚至不会意识到“反向长连接 + 真机执行 + 服务端调度”这条路可以这么顺。
但工具用久了,需求会变。
刚开始我们只想“能调通”。后来就会想:
这些问题堆在一起,就不再是一个“RPC 客户端库”的问题,而是一个设备 RPC 调度平台的问题。
这就是 r0rpc 要补的空。
Hermes 是一个运行在终端里的 AI Agent。
普通 AI 更像问答助手,你问一句,它答一句;Hermes 更像一个能长期协作的工程同伴。它能读项目、改代码、跑命令、定位问题、补测试、调配置,并且在多轮对话里持续理解你的偏好和项目上下文。
它最强的不是“会写代码”。
会写代码的工具现在很多,但真正难的是:
这次 r0rpc 的过程很典型。
一开始我的需求其实非常长,甚至有点像“我全都要”:
参考 Sekiro RPC 框架,我想写一份属于自己的 RPC。
需要高并发,有后台,后台用 Go。
能权限管理,能管理账号,能管理 action。
能缓存请求数据及结果 30 天。
能分析单个设备成功率。
能看 group 下有哪些设备。
能指定设备请求,不指定设备就轮询。
MySQL / Redis 可 Docker 安装,也能接外部。
后台界面能看到手机请求成功率。
group 后台创建好了且状态可用,才能被 app 调用。
用 WebSocket 连接。
app 断开后自动重连。
防止瞬间很多台手机打上去导致雪崩。
给 Xposed demo,给 Python 模拟 app 端。
PC 端接口也能转发。
心跳 5 秒一次,20 秒连不上就显示断开。
名字叫 r0rpc。
正常人工接到这种需求,第一反应大概率不是马上写代码,而是先皱眉。
因为这里面不止一个功能点,而是混着几类问题:
| 问题类型 | 实际要解决的事 |
|---|---|
| 长连接 | 手机和服务端保持 WebSocket 通道 |
| 调度 | 请求来了以后,分配给哪台设备 |
| 并发 | 同一台设备能承载多少 in-flight 请求 |
| 保活 | 心跳、超时、断线、重连 |
| 防雪崩 | 多设备同时断开后不能同时重连打爆服务 |
| 管理 | group、action、账号、权限 |
| 可观测性 | 在线状态、成功率、耗时、错误 |
| 存储 | 请求参数、响应结果、统计数据 |
| 部署 | MySQL、Redis、配置文件、Docker |
| 客户端 | Xposed、Python、PC 调用方 |
Hermes 最像人的地方就在这:它不是直接开写一个“大泥团”,而是先判断这不是普通 WebSocket 转发服务,而是一个设备 RPC 调度系统。
这一步很关键。
方向对了,后面才会越写越顺。
做安卓逆向和数据自动化的人,对 RPC 这条路一般都不陌生。
很多时候,我们不是不想纯协议,不是不想把加密完全还原出来,而是现实情况不允许。
有些加密链路非常长:
这时候硬抠协议当然可以,但成本可能非常高。
RPC 的思路就很直接:
既然目标 App 自己能算,那就让它自己算。
我们只负责把请求送进去,把结果拿出来。
它的价值不是优雅,而是有效。
在真实业务里,有效往往比优雅重要。
RPC 最大的好处,是把复杂问题换了一个维度。
原来你要解决的是:
换成 RPC 后,问题变成:
后者仍然不简单,但它更工程化,也更可控。
尤其在下面几类场景里,RPC 很香:
| 场景 | RPC 的价值 |
|---|---|
| 加密复杂 | 不用完整还原算法,直接借目标环境执行 |
| 风控强 | 真机环境天然更接近真实用户 |
| 版本变化快 | App 更新后,很多逻辑仍可通过 hook 点继续复用 |
| 数据链路长 | 可以在 Java 层、业务层、返回层直接截获关键数据 |
| 需要快速出活 | 比从零逆完整协议更快落地 |
说白了,RPC 是一种很实战的路线。
不一定最漂亮,但能打。
不过 RPC 也有自己的硬伤。
早期很多 RPC 方案更像“能用就行”的工具,单人调试很舒服,一旦进入多设备、多 action、多调用方、多并发,问题就开始暴露:
这些问题不解决,RPC 就永远停在“小工具”阶段。
r0rpc 要做的,就是把它往“平台”方向推一步。
r0rpc 的核心目标很简单:
把手机端能力,通过 WebSocket 长连接,稳定地变成服务端可调用的 RPC 能力。
整体链路大概是这样:
调用方
|
| HTTP API
v
r0rpc Go 服务端
|
| group / action / device 调度
v
在线设备池
|
| WebSocket
v
Xposed / Python / App 客户端
|
| 执行业务 action
v
返回结果、耗时、错误、请求参数
它不是只追求“能调通”,而是把真实使用中最容易痛的地方都补上。
早期 RPC 工具最难受的一点,是很多状态只能靠猜。
设备在不在线?
哪个 group 有设备?
哪个 action 最近失败多?
某台手机是不是已经卡住?
调用方只看到“失败”,但不知道失败发生在哪里。
r0rpc 做了后台之后,这些东西就可以直接看。
后台能管理:
这对 RPC 来说提升非常大。
因为 RPC 最大的问题从来不是“跑一次”,而是“跑久了之后怎么知道哪里坏了”。
很多 RPC 工具里,group 是调用时直接传的。
这样很自由,但也很容易乱。
比如今天写 idlefish,明天有人写 idle_fish,后天又有人写 xianyu。短期能跑,长期就是灾难。
r0rpc 的规则更硬:
group 必须先在后台创建,并且状态为可用,app 端才能加入。
如果 group 不存在或未启用,直接提示没有这个 group。
这个设计看起来只是多了一道校验,其实是在给系统立边界。
有边界,后面才能统计、权限、审计、限流、隔离。
action 是 RPC 的核心入口。
如果 action 没有管理,最后一定会变成一堆没人敢删的字符串。
r0rpc 把 action 放进后台管理,让它从“随便传一个名字”变成“平台内的受控资源”。
这样做的好处是:
真实场景里,调用方式一般有两种:
一种是指定设备:
这次请求必须打到某一台手机。
比如这台设备登录了某个账号,或者只有它有某个状态。
另一种是不指定设备:
只要 group 下有可用设备,谁空闲就谁处理。
这时候就需要轮询和调度。
r0rpc 两种都支持:
这才像一个可以长期跑的 RPC 调度层。
RPC 调试最怕什么?
最怕线上失败后只剩一句“调用失败”。
到底传了什么参数?
设备返回了什么?
中间耗时多少?
是服务端超时,还是设备端报错?
如果没有记录,排查就只能靠复现。
r0rpc 会把请求参数、响应结果、耗时、状态等信息沉淀下来。默认保留策略可以配置,文章里按 30 天这个目标设计,也支持通过配置控制保留条数。
这对实战太重要了。
RPC 一旦接入业务,就不只是“能不能请求成功”,而是要能解释每一次失败。
多设备场景里,总成功率没那么有用。
真正有用的是:
r0rpc 后台可以看设备维度的成功率。
这意味着你不用再靠感觉判断“这台手机是不是不太行”,而是能拿数据说话。
RPC 方案真正跑起来以后,保活比很多功能都重要。
因为手机不是服务器。
它会锁屏,会断网,会被系统杀后台,会切网络,会卡死,会重启,会因为目标 App 状态异常导致 action 不响应。
所以 r0rpc 在保活上做了几件事。
r0rpc 的设备连接使用 WebSocket。
设备端定期心跳:
心跳间隔:5 秒
离线判定:20 秒无响应
这个配置的好处是上下线足够灵敏。
5 秒心跳能比较快感知设备还活着;20 秒判离线又不会因为一次网络抖动就误杀。
对后台来说,这个体验很关键。
你看到设备在线,就应该基本可信;设备掉了,也应该尽快显示出来。
这个点很实用。
设备不是只断几秒。
它可能断一分钟,断一小时,甚至断一天。
r0rpc 的客户端重连逻辑不是“一次失败就结束”,而是持续重试。只要进程还在、网络恢复、服务端可达,就会继续尝试连回去。
这才符合移动端 RPC 的真实环境。
很多人写重连,会写成这样:
断了 -> 立刻重连
失败 -> 立刻再连
单台设备没问题。
但如果是几十台、几百台设备同时断网又同时恢复,就会变成一波重连洪峰。
r0rpc 的重连思路是:
这就是从“小工具”到“平台”的区别。
小工具只要连得上。
平台要考虑连不上、断了、一起断、一起回来、回来以后还有大量请求排队。
这里还是要说明一下:我使用和对比的主要是早期 Sekiro 体验,后续新版如果已经增强了后台、性能和管理能力,不在本文结论范围内。
但从我这次实测和迁移体验看,r0rpc 的优势非常直观。
| 维度 | 早期 Sekiro 体验 | r0rpc |
|---|---|---|
| 在线设备查看 | 不够直观 | 后台和接口都能查 |
| group 状态 | 调用侧更自由 | 后台创建并启用后才能使用 |
| 防雪崩 | 需要自行处理 | 重连退避和抖动,降低同时打爆风险 |
| 请求记录 | 不方便统一回看 | 参数、结果、耗时、状态可记录 |
| 成功率 | 不方便按设备分析 | 单设备成功率可分析 |
| 后台界面 | 没有完整后台 | 有管理后台 |
| 运维体验 | 偏工具 | 偏平台 |
我最喜欢的是可观测性这块。
以前 RPC 调不通,经常像在黑盒里摸。
现在至少能看见:
看得见,才能管得住。
服务端对外提供 HTTP API,调用方不用关心设备怎么连,只管发请求。
示例:
POST fc0K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0p5#2z5g2)9J5k6e0M7#2i4K6u0W2x3e0l9H3i4K6u0W2x3U0t1#2i4K6y4m8z5e0R3%4y4W2)9J5c8Y4u0H3j5#2)9J5c8X3W2F1N6X3!0C8k6g2)9J5c8X3W2V1L8r3g2X3K9i4y4Z5i4K6u0r3k6r3g2U0M7Y4W2H3N6l9`.`.
Content-Type: application/json
{
"payload": {
"encode_str": "v7eNwdELBmc1hOkagpP6NQ=="
}
}
服务端收到请求后,会根据 group 和 action 找到可用设备。
如果你不指定设备,它会在在线设备里轮询。
如果你指定设备,它会直接发给目标设备。
响应里会带回业务结果,也会带回请求参数和耗时信息,方便调试和记录。
Python 调用大概是这种感觉:
import requests
url = "fccK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0p5#2z5g2)9J5k6e0M7#2i4K6u0W2x3e0l9H3i4K6u0W2x3U0t1#2i4K6y4m8z5e0R3%4y4W2)9J5c8Y4u0H3j5#2)9J5c8X3W2F1N6X3!0C8k6g2)9J5c8X3W2V1L8r3g2X3K9i4y4Z5i4K6u0r3k6r3g2U0M7Y4W2H3N6l9`.`."
seller_id = "v7eNwdELBmc1hOkagpP6NQ=="
data = {
"payload": {
"encode_str": seller_id,
}
}
resp = requests.post(url, json=data, timeout=5)
resp.raise_for_status()
print(resp.json())
如果是 Xposed 侧,客户端初始化也尽量保持干净:
RelayClient relayClient = new RelayClient(
"159.75.100.225",
9876,
"admin",
"123456",
androidId,
"idlefish"
);
Build.MANUFACTURER 这种平台信息不需要每次显式传,客户端默认自己取。
maxInFlight 默认 256,不用每次写一串链式调用,让调用代码看起来像堆配置。
这点虽小,但很影响使用体验。
测试环境:
接口:POST 1a9K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0p5#2z5g2)9J5k6e0M7#2i4K6u0W2x3e0l9H3i4K6u0W2x3U0t1#2i4K6y4m8z5e0R3%4y4W2)9J5c8Y4u0H3j5#2)9J5c8X3W2F1N6X3!0C8k6g2)9J5c8X3W2V1L8r3g2X3K9i4y4Z5i4K6u0r3k6r3g2U0M7Y4W2H3N6l9`.`.
body:{"payload":{"encode_str":"v7eNwdELBmc1hOkagpP6NQ=="}}
在线设备:1 台 Xiaomi
clientId:360e24c72173aa04
maxInFlight:256
压测结果:
| 并发 | 请求数 | 成功率 | 吞吐 | 平均延迟 | P95 | 结论 |
|---|---|---|---|---|---|---|
| 1 | 20 | 100% | 28.6 req/s | 34.8ms | 44.2ms | 很稳 |
| 5 | 50 | 100% | 113.8 req/s | 42.1ms | 88.5ms | 很稳 |
| 10 | 100 | 100% | 224.8 req/s | 41.8ms | 62.5ms | 很稳 |
| 20 | 200 | 100% | 404.9 req/s | 46.0ms | 80.6ms | 很稳 |
| 50 | 500 | 100% | 855.6 req/s | 53.7ms | 76.9ms | 效果很好 |
| 100 | 1000 | 100% | 873.6 req/s | 105.0ms | 168.8ms | 稳 |
| 200 | 2000 | 100% | 922.5 req/s | 200.1ms | 228.3ms | 稳,延迟上升 |
| 256 | 2560 | 100% | 872.1 req/s | 269.8ms | 314.2ms | 到设备上限,仍可用 |
| 512 | 1024 | 100% | 275.3 req/s | 423.0ms | 1083.3ms | 不推荐,尾延迟明显变差 |
这个结果比我预期还要好。
单台 Xiaomi 跑 decrypt,最舒服的并发区间在:
推荐并发:50 - 200
可用上限:256
不建议:512
注意 512 并发虽然没有失败,但吞吐掉了,P95 也上来了。
这说明瓶颈不在 Go 服务端,而是在设备处理、网络排队、调用端调度和 HTTP 并发上。
所以生产环境不是并发越大越好,而是要找到设备最舒服的区间。
对这台设备来说,maxInFlight = 256 是一个比较合理的默认值。
后来又接了 2 台 Xiaomi,每台 maxInFlight = 256,理论总 in-flight 是 512。
| 并发 | 请求数 | 成功率 | 吞吐 | 平均延迟 | P95 | 结论 |
|---|---|---|---|---|---|---|
| 100 | 1000 | 100% | 706.9 req/s | 105.4ms | 248.6ms | 稳 |
| 200 | 2000 | 100% | 919.1 req/s | 196.8ms | 457.8ms | 稳 |
| 400 | 4000 | 100% | 982.4 req/s | 337.7ms | 592.1ms | 可用 |
| 512 | 5120 | 100% | 930.4 req/s | 485.6ms | 673.0ms | 到上限,尾延迟变高 |
| 800 | 1600 | 93.69% | 270.2 req/s | 932.1ms | 5007.9ms | 不建议,调用端连接超时 |
两台设备情况下,推荐业务并发控制在:
推荐并发:200 - 400
极限可用:512
不建议:800
这个结果也很符合预期。
设备数上来以后,吞吐确实能继续提升,但不是无限线性增长。因为每台手机本身就是一个有限执行器,最终还是会被 CPU、目标 App、网络、Hook 逻辑、调用超时共同限制。
r0rpc 做得好的地方,是在这个限制内尽量稳定地调度,而不是让请求乱飞。
为了更直观,我又用同一台手机对 Sekiro 做了压测。
Sekiro 测试接口:
import requests
sekiro_url = "946K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0p5#2z5g2)9J5k6e0M7#2i4K6u0W2x3e0l9H3i4K6u0W2x3U0t1#2i4K6y4m8y4e0j5H3x3W2)9J5c8X3W2F1N6X3!0C8k6b7`.`."
data = {
"group": "idlefish",
"action": "decrypt",
"encode_str": "v7eNwdELBmc1hOkagpP6NQ==",
}
resp = requests.post(sekiro_url, data=data)
print(resp.json())
对比结果如下:
| 并发 | r0rpc 成功率 | r0rpc QPS | r0rpc P95 | Sekiro 成功率 | Sekiro QPS | Sekiro P95 | 结论 |
|---|---|---|---|---|---|---|---|
| 1 | 100% | 28.6 | 44ms | 100% | 11.1 | 143ms | r0rpc 更快 |
| 5 | 100% | 113.8 | 89ms | 100% | 40.3 | 249ms | r0rpc 更快 |
| 10 | 100% | 224.8 | 63ms | 100% | 112.9 | 132ms | r0rpc 约 2 倍吞吐 |
| 20 | 100% | 404.9 | 81ms | 100% | 211.0 | 177ms | r0rpc 约 2 倍吞吐 |
| 50 | 100% | 855.6 | 77ms | 100% | 243.0 | 1148ms | r0rpc 明显领先 |
| 100 | 100% | 873.6 | 169ms | 24.1% | 119.8 | 5034ms | Sekiro 已明显过载 |
| 200 | 100% | 922.5 | 228ms | 未继续测 | - | - | r0rpc 仍稳定 |
| 256 | 100% | 872.1 | 314ms | 未继续测 | - | - | r0rpc 到单机上限仍可用 |
这张表最关键的不是 QPS 数字有多漂亮,而是趋势非常明显。
在低并发下,r0rpc 延迟更低。
在 10-20 并发区间,r0rpc 吞吐大概能到 Sekiro 的 2 倍左右。
在 50 并发时,r0rpc 仍然稳定,Sekiro 的 P95 已经超过 1 秒。
到 100 并发时,r0rpc 仍然 100% 成功,而 Sekiro 成功率掉到 24.1%,并且出现大量 no enable device online 这类问题。
如果按“舒服可用区间”看:
| 框架 | 舒服区间 | 可用上限 | 过载表现 |
|---|---|---|---|
| r0rpc | 100 - 200 并发 | 256 仍可用 | 512 开始尾延迟变差 |
| Sekiro | 10 - 20 并发 | 50 已明显吃力 | 100 并发成功率明显下降 |
这就是 r0rpc 最能打的地方。
它不是只在单次调用里快一点,而是在并发上来以后,仍然能保持成功率和可观测性。
这里不吹玄学,只看设计。
r0rpc 能稳,主要靠几件事:
Go 写这种服务很舒服。
一个设备一条连接,一个请求一个上下文,goroutine 的模型很适合处理 WebSocket 长连接和并发调度。
相比把线程池、事件循环、连接管理混在一起调,Go 的心智负担更低。
对 r0rpc 这种“长连接 + 请求分发 + 状态统计 + 后台管理”的项目来说,Go 是很合适的选择。
手机不是无限并发机器。
你给它 1000 个请求,它不会真的变强,只会排队、超时、抖动。
r0rpc 给客户端设计了 maxInFlight,默认 256。
这相当于给单设备设了上限。
超过设备承载能力后,系统应该排队、拒绝或者调度到其他设备,而不是无脑继续塞。
调用方只管发 HTTP 请求。
设备选择、在线状态、group 校验、action 校验、超时处理,都交给服务端。
这让调用方更轻,也让平台有机会做统一治理。
性能问题不可怕。
可怕的是性能问题发生后没有证据。
r0rpc 会把请求和结果记录下来,再配合成功率和延迟统计,就能知道问题到底出在哪里。
这比“感觉今天有点慢”强太多。
如果只看最终代码,你可能会觉得:
不就是 Go + WebSocket + MySQL + Redis + 后台吗?
但真正难的是从一个很乱的需求出发,把它变成一个能跑、能部署、能压测、能继续改的项目。
Hermes 在这个过程中很像一个不会喊累的工程搭子。
我提需求,它先拆。
我说接口 404,它去查本地路由。
我说 app 断一天会不会重连,它去看客户端重连逻辑。
我说成功率算不算设备掉线请求,它去看统计口径。
我说保留多少条请求记录,它把硬编码挪到配置。
我说 Java 初始化太丑,它把 IP 和端口拆开,把平台参数内置,把默认 maxInFlight 收进去。
我说要压测,它补 Python 脚本,跑 r0rpc,再跑 Sekiro,再做对比表。
这不是单次问答,这是连续工程协作。
更离谱的是,很多改动不是“写出来就完了”,而是能继续追问:
它都能顺着项目往下查。
这就是 Hermes 真正的价值。
它不是替你敲几行代码,而是把你的想法推进成一个工程结果。
这个话题必须说实话。
AI 很强,但不是魔法。
就 r0rpc 这个项目来说,AI 的优势非常明显:
但人工工程经验仍然重要:
更直观一点:
| 维度 | Hermes / AI 协作 | 人工资深工程师 |
|---|---|---|
| 速度 | 极快,一上午能铺出完整 demo 并继续迭代 | 更慢,会先设计边界和模型 |
| 覆盖 | 容易一次性覆盖服务端、后台、客户端、脚本、文档 | 更倾向分阶段交付 |
| 执行力 | 适合连续改 bug、补配置、跑验证 | 适合长期架构把关 |
| 高并发 | 能快速实现并压测修正 | 更早考虑背压、限流、队列和故障隔离 |
| 安全性 | 需要人工继续审 | 通常会更早收口 |
| 文档 | 写得快,但需要调语气和结构 | 更贴近项目长期维护 |
| 最佳姿势 | 让 AI 做推进器,人做方向盘 | 做最终设计判断和质量兜底 |
所以我的感受不是“AI 取代工程师”。
更准确地说,是工程师多了一台非常夸张的加速器。
以前你需要先学 Go、学前端、学 WebSocket、学 Docker、学 MySQL、学 Redis、学 Xposed 接入,再一点点拼起来。
现在你可以先提出目标,让 Hermes 帮你铺出一版能跑的系统,然后你再围绕真实问题不断打磨。
这对个人开发者太友好了。
整理一下,当前 r0rpc 已经具备这些能力:
maxInFlight = 256;这已经不是“一个 RPC demo”了。
它是一套可以继续往生产形态演进的 RPC 平台雏形。
配置独立出来非常重要。
数据库、Redis、保留策略、服务端口、登录账号、token 时间、请求记录保留数量,这些都不应该散落在代码里。
尤其是准备部署到不同服务器时,配置化能少踩很多坑。
MySQL 和 Redis 也不应该绑定死:
示例配置建议写成这种风格:
mysql:
host: mysql
port: 3306
database: new_demo
username: root
password: "改成自己的密码"
charset: utf8mb4
connMaxLifetime: 300s
redis:
host: myredis
port: 6379
password: "改成自己的密码"
db: 8
rpc:
heartbeatInterval: 5s
offlineAfter: 20s
defaultMaxInFlight: 256
requestRetentionDays: 30
rawRequestKeepLatestPerScope: 100
这里建议公开文章里不要直接放真实密码。
配置可以展示结构,但密码最好用占位符。
以前做这类东西,流程大概是:
先找项目,跑起来,改一堆配置。
再写客户端,调 WebSocket。
再写 HTTP 转发。
再补后台。
再补数据库。
再处理断线。
再处理并发。
再写压测。
再定位为什么设备离线。
再想办法统计成功率。
一圈下来,时间就没了。
这次不一样。
我把目标说清楚,Hermes 开始拆,拆完开始写,写完开始跑,跑不通就查,查完继续改,改完继续压测。
整个过程最爽的地方是:我不需要一次性成为 Go 后端、前端、Android、Xposed、运维、压测全栈高手。
我只需要知道我要什么,然后持续提出判断和修正。
Hermes 负责把大量工程体力活推过去。
这就是它最牛的地方。
RPC 不是银弹。
它解决不了所有问题,也不适合所有场景。
但在安卓逆向、真机自动化、复杂加密调用、强风控链路里,它仍然是一条非常有价值的路线。
Sekiro 证明了这条路能走。
r0rpc 想做的是,把这条路继续往工程化、平台化、可观测、高并发方向推一步。
而 Hermes 让我最直观地看到了一件事:
个人开发者的工程上限,正在被 AI Agent 重新抬高。
以前一个人想做一套 RPC 平台,可能需要很长时间。
现在你可以先做出来,再压测,再修,再完善。
从想法到能跑,从能跑到能看,从能看到能压,从能压到能对比,这个链路被大幅缩短。
这就是 Hermes。
这也是 r0rpc 这次最值得记录的地方。
项目地址:
03eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6E0j5h3&6&6N6h3g2Y4L8$3&6Y4x3K6y4Q4x3V1k6J5x3s2u0H3j5H3`.`.
感谢 r0ysue 大佬的指导,也感谢 virjar 大佬和 Sekiro 项目给这个方向提供的启发。
没有这些开源和经验铺路,很多新人要多走非常多弯路。
附:
Sekiro 新版文档:8caK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6k6h3E0A6M7X3!0Q4x3X3g2A6K9h3&6@1K9g2)9J5k6h3y4F1i4K6u0r3M7$3g2C8K9i4u0G2i4K6u0V1k6r3!0U0i4K6u0r3
如果后续反馈不错,我会继续完善保活 App、事件重放、更多设备调度策略、更多后台统计能力,把 r0rpc 继续往真正可用的设备 RPC 平台方向推进。
前面讲了这么多 r0rpc,其实还有一条暗线更值得记录:这套东西不是我一个文件一个文件硬啃出来的,而是 Hermes 一路参与拆需求、写代码、改配置、跑压测、修问题推出来的。
所以这里把 Hermes 的安装过程也放出来。不是为了写成工具手册,而是想让读者能复刻这个体验:先把 Agent 跑起来,再把一个复杂工程目标丢给它,让它陪你把东西真正落地。
本次环境:
安装步骤很简单:
git clone 870K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6z5L8%4g2K6f1X3g2K6k6h3q4J5j5$3S2Q4x3V1k6Z5k6i4u0E0k6i4y4Q4x3X3c8S2k6$3g2F1N6q4)9J5k6h3N6A6N6l9`.`.
cd hermes-agent
pip install .

接下来准备模型 API。这里我用的是 DeepSeek,注册入口如下:
882K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6H3L8r3q4@1k6X3!0J5L8g2)9J5k6h3c8W2k6i4m8K6k6h3g2C8i4K6u0W2j5$3!0E0i4K6u0r3N6i4y4S2k6$3f1`.
流程大概是:注册账号 -> 充值 -> 进入 API keys -> 创建 key。
注意一点:API key 通常只在创建时完整显示一次,创建后先保存好,再关闭页面。公开文章、截图、仓库配置里都不要直接放真实 key。

Hermes 配置示例:
hermes config set api_key sk-xxxxxxxxxxxxxxxx
hermes config set provider deepseek
hermes config set model deepseek-v4-pro
hermes config set base_url d34K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6S2M7r3W2Q4x3X3g2V1k6h3g2H3M7$3g2W2K9#2)9J5k6h3y4G2L8b7`.`.
如果你用的模型名和我不一样,把 model 改成自己账号当前可用的模型即可。这里重点不是绑定某个模型,而是让 Hermes 能稳定接上模型服务。

配置完成后,直接进入对话模式:
hermes chat
我这里随手让它写一个 Python 单例,能正常输出,就说明环境已经跑通了。

到这一步,Hermes 就不是一个“网页聊天框”了,而是能在本地终端里参与工程协作的 Agent。它能读项目、执行命令、修改文件、看报错、继续追问题。r0rpc 后面那些 Go 服务端、后台、WebSocket、Xposed demo、Python 模拟端、压测脚本和配置修正,都是在这种协作方式下被一点点推起来的。
r0rpc 搭起来之后,后台默认访问地址是:
http://你的服务器 IP:9876/
为了方便大家先看效果,我这里临时搭了一个演示地址:
ef1K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0p5#2z5g2)9J5k6e0M7#2i4K6u0W2x3e0l9H3i4K6u0W2x3U0t1#2i4K6y4m8z5e0R3%4y4W2)9J5c8R3`.`.
真正部署到自己服务器时,建议第一时间修改默认账号密码,检查 MySQL / Redis 密码,避免把管理后台长期裸露在公网。
登录页长这样:
登录后能看到后台主界面。这里不是单纯做了一个“能登录的壳”,而是把 RPC 最需要管理的东西都摆到了台面上:账号、group、client、action、请求记录、在线状态和统计数据。

在 group / client 这些页面里,可以很直观看到当前设备接入情况。哪些设备在线、属于哪个 group、最近状态怎么样,不再靠日志里翻,也不再靠调用方自己猜。

这几张后台截图其实很关键。
早期 RPC 工具最容易给人的感觉是“能用,但黑盒”。请求发出去了,设备有没有在线、action 有没有配置、group 写没写错、失败到底发生在哪一层,都需要自己排。
r0rpc 想解决的就是这个痛点:
所以我前面一直说,r0rpc 不是“又写了一个 RPC 转发 demo”。
它真正想做的是把真机 RPC 这件事,从临时工具推进到平台形态:能接设备,能看状态,能管资源,能压并发,能定位问题,也能继续扩展。
这也是 Hermes 在这次项目里最让我有感觉的地方。它不是只把某个函数写出来,而是一路把“我想要一套自己的 RPC 平台”这个很散的想法,推成了一个有后台、有部署、有客户端、有压测数据、有截图证据的工程结果。
更多【AI 助力安全- 我让 Hermes 把古法 RPC 重新炼成了高并发调度平台:r0rpc 实战】相关视频教程:www.yxfzedu.com