惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
The GitHub Blog
The GitHub Blog
F
Fortinet All Blogs
Last Week in AI
Last Week in AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
L
LangChain Blog
爱范儿
爱范儿
博客园_首页
Stack Overflow Blog
Stack Overflow Blog
MongoDB | Blog
MongoDB | Blog
博客园 - 三生石上(FineUI控件)
大猫的无限游戏
大猫的无限游戏
宝玉的分享
宝玉的分享
GbyAI
GbyAI
H
Help Net Security
A
About on SuperTechFans
Recent Announcements
Recent Announcements
Hugging Face - Blog
Hugging Face - Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
雷峰网
雷峰网
D
Docker
博客园 - Franky
有赞技术团队
有赞技术团队
G
Google Developers Blog

V2EX

我用 AI 写代码,但终端管理反而成了累赘——于是我做了 codux [调研] 各位在公司都用什么 ide 和 agent 写代码? 老运维 share 一个运维平台 看到有公司考核 token 指标,很好奇大家上个月的 AI 账单是多少 GLM-Coding 调用持续报错: z.ai 的 Lite 套餐几乎无法使用,官方 Pro/Max 是否稳定? 现在还有什么渠道可以稳定安全地使用 Claude 吗? 上海漕河泾内推,本组有 2 个 hc,一个后端,一个前端,预算都是 20k 左右,不打卡,氛围好 如果 V2EX 上有一组不永久保存聊天记录(比如只保存 7 天或者 24 小时)的聊天室,那么会开启哪些有用或者有趣的可能? gemini cli 貌似挂了,一直返回 403 第一次在自媒体上赚到钱 收集了最近在使用的低价 GPT, Gemini,邮箱等 AI 会员的小店合集 讨论个大实话:现在企业还在说 AI 编程提效 20%, 30%的,真的太落后,没用懂 AI。因为包括很多前沿公司,已经狂奔到提效 200%-500%的情况 [招聘][远程][币安] 前端/后端/QA/iOS/Android 至少 3 年以上经验 目前有大量 HC 欢迎投递 Chatgpt Pro 用量用不完的可以开这些设置 面试的时候好像遇到钓鱼了,给各位避个坑 cursor 年续费 22 号到期, 自动续费是否还是老的计次套餐呢 被两件破事毁掉的一下午,琐碎的内耗消磨人的精力 使用 Planet 存储 Codex 的会话或者重要信息 如果业务部门领导不要你开发功能,而是要求你教会它用 claude code 开发功能,你会怎么做? 分享一个 MacOS 接绿联 CM818 USB 转 DP 转接器使用感受 我的 HR 朋友 10 年老 Java ,非全大专,大家帮忙看看简历 开源了一个 AI 口语练习工具,音素级发音评分,完全免费可自部署 V2EX 上有哪些你觉得很有趣、印象深刻的妹纸? 字节为啥不出个国内版 Vercel? 有在大马的朋友吗? 问个运营商问题 你们在有领导的公司大群发过的最大胆的消息是什么 公司裁员,目前没有工作。想试试摆摊,做一个移动鲜啤打酒车 我的硬盘 Memblaze Pblaze 5 Linux 下不识别,给 Linux 内核提交了补丁, AI 说有望被合并 只有我一个人觉得 codex 不好用?
Handsets - 高性能 Android 自动化 CLI,原生 adb 太卡太慢
prasanta · 2026-05-21 · via V2EX

先看一个 demo,这是给 Agent 用的杀手级动作 —— hs ui -i 把整棵 UI 树压成一张可读的扁平表,只留下能点 / 能填 / 能看的节点:

$ hs ui -i
@(54,160)    click              ImageButton                desc="返回"
@(540,360)                      TextView   #title          "登录你的账户"
@(540,540)   click,focus        EditText   #email          ""
@(540,640)   click,password     EditText   #password       ""
@(540,760)   check              CheckBox                   "记住我"
@(540,860)   click              Button     #continue       "继续"
@(540,960)   click              TextView                   "忘记密码?"

每行四列:中心坐标 / 行为标签 / 类名+id / 文本或 desc。完美的 LLM-friendly 表达 —— 喂给模型就能让它做决策,比丢一整棵 XML 节省 10-100× 的 token,定位也直接给出可点的中心点。

把它跟 hs tap 串起来,一行就能完成 "找 Login 按钮、点它":

hs tap "继续"                              # 文本匹配
# 或者更稳的 CSS-like 选择器
hs find 'Button[text="继续"]' | head -1    # 拿坐标
hs type EditText "[email protected]"        # ACTION_SET_TEXT,绕开 IME
hs wait com.foo/.HomeActivity              # 事件驱动等待,不轮询

写过 Android 自动化、爬手机、UI 测试、Agent 控机的应该都被 adb 折磨过:每条命令都要 fork → shell → app_process 冷启动一遍,跑 N 条命令就交 N 次启动税。dumpsysgetpropsettings 这种读得最勤的状态从来没人帮你缓存。UI 操作没有 CSS 选择器、没有原子 set text 、没有 event-driven 等待。

Handsets 把这块重写了:

  • 设备端是一个常驻 JVM daemon(app_process 跑,shell UID,hidden-API 已解锁),用一条 TCP 长链跟主机通信。
  • 主机端 CLI hs 是 Rust pure std,零第三方依赖,单文件 1MB 出头。
  • 主机后台 push 一份 state 镜像到 ~/.handsets/state-<port>.json,hs info / hs show 直接读本地文件,亚毫秒级

为什么有必要(vs adb,同机模拟器实测)

命令 hs adb 提速
hs state X(host 缓存读) 0.21 µs 100+ ms 走 dumpsys ~10 000×
hs see x.jpg(截图) 7.7 ms 705 ms 92×
hs info(12 字段快照) 2.5 ms 200+ ms 串多次 getprop 80×+
hs show top 2.0 ms 86 ms 43×
hs prop KEY 1.6 ms 46 ms 29×
hs settings get 4.5 ms 69 ms 15×

跑 100 条 dump_active 整体 0.91s vs adb 的 1.65s,单次差距越大、批量收益越大。Agent 这种高频小命令场景一上量特别明显。

跟 uiautomator2 / Appium 比有什么不一样

vs uiautomator2(openatx)

  • 架构:uiautomator2 = atx-agent + com.github.uiautomator 两个 apk + HTTP/JSON,每次操作进 UIAutomator instrumentation 框架,光 framework overhead 就吃几十 ms 。Handsets 直接 app_process 跑轻量 daemon,绕开 UIAutomator,直接打 binder/反射调系统服务。
  • 协议:HTTP/JSON vs TCP 长链 + 二进制帧,单次操作没有 HTTP/JSON 开销
  • 状态:d.info / d.app_current() 每次都 round-trip;Handsets 推到本地文件,file read,0.21µs
  • 安装:uiautomator2 要装 apk(PackageInstaller 、签名、弹窗);Handsets 只是 adb push hs.jar,不装 apk
  • UI 表达:d.dump_hierarchy() 返回完整 XML(几百 KB);hs ui -i 直接给一张扁平可读表,Agent / LLM 场景下 token 用量差一个数量级。

vs Appium

  • 重量:Appium = Node server + appium-uiautomator2-driver apk + WebDriver 链,启动几秒。hs use < 200ms 。
  • 协议:WebDriver(HTTP)vs 原生 TCP,没有 W3C 那套握手开销
  • 场景:Appium 是 cross-platform CI 测试最优解(iOS + Android 、selenium-like API 、录制回放),Handsets 偏 agent / 自动化 / 命令行驱动 / 高频小命令 —— 不需要 WebDriver 协议时,这层全是负担。
  • 选择器:AndroidUIAutomator/AccessibilityId vs CSS-like:hs find 'TextView[text~=Login], Button[desc=Sign in]',逗号 = OR,短而熟悉

老实说哪边不如它们:uiautomator2 / Appium 有录制工具、IDE 集成、test runner 、报告框架。Handsets 是 lean CLI,目前没有生态层的东西。写 pytest 跑回归测试出 HTML 报告,还是用 uiautomator2 + pytest 更顺手。Handsets 适合的是 「 LLM agent / 脚本 / 命令行循环」 这种你只关心单次延迟和组合性的场景。

安装(macOS / Linux 都有 release 包)

curl -fsSL https://raw.githubusercontent.com/elliotgao2/handsets/main/install.sh | bash
hs use
hs ui -i      # 试试这个,见上面

CI 会在 tag 上自动 cross-build macOS arm64/x86_64 、Linux x86_64/aarch64,附 SHA256 。

GitHub: https://github.com/elliotgao2/handsets

欢迎拍砖,特别是用过 uiautomator2 / Appium 的同学,或者正在做 LLM 控机 / Agent 自动化的同学,看看哪些场景值得再优化。