elliotgao2 /
handsets
handsets(命令叫 hs)是一个用 Rust 写的 Android UI 自动化 CLI,专门为 LLM agent 设计了 verb-led 的输出格式。不需要 root、不需要装 APK,单二进制 + 一个 jar 通过 adb forward 跑在设备 shell UID 下即可工作。 跟 adb shell / uiautomator2 / Appium 的区别: | | handsets | adb shell | ui…
elliotgao2 /
handsets(命令叫 hs)是一个用 Rust 写的 Android UI 自动化 CLI,专门为 LLM agent 设计了 verb-led 的输出格式。不需要 root、不需要装 APK,单二进制 + 一个 jar 通过 adb forward 跑在设备 shell UID 下即可工作。 跟 adb shell / uiautomator2 / Appium 的区别: | | handsets | adb shell | ui…
handsets(命令叫 hs)是一个用 Rust 写的 Android UI 自动化 CLI,专门为 LLM agent 设计了 verb-led 的输出格式。不需要 root、不需要装 APK,单二进制 + 一个 jar 通过 adb forward 跑在设备 shell UID 下即可工作。 跟 adb shell / uiautomator2 / Appium 的区别: | | handsets | adb shell | uiautomator2 | Appium | | ---------------- | -------------- | ---------- | ------------ | --------- | | 单次调用延迟 | 2–7ms | 40–700ms | 30–100ms | 100–500ms | | 按 label 查找 | 是 | 否 | 是 | 是 | | 设备端安装 | 一个 ~几百 KB 的 jar | 无 | 两个 APK + atx-agent | driver APK + Node 服务 | 它能做什么:典型用法 驱动登录的完整流程: bash hs use # 连设备、起 daemon hs ui # agent 看一眼当前屏幕 hs fill 手机 13800138000 # 自动找到手机号 EditText hs tap 获取验证码 # 自动走 ACTIONCLICK hs fill 验证码 123456 hs tap 登录 hs ui 的输出是给 LLM 看的 verb-led 表格 —— 每一行直接告诉 agent 该用哪个动词、目标 selector 是什么、坐标在哪: tap ImageButton "返回" 98,243 fill EditText "请输入手机号码" #aliuserloginmobileet 720,1059 tap Button "获取验证码" #aliuserloginsendsmscodebtn 1202,1255 tap Button "登录" #aliuserloginloginbtn 720,1521 Claude / GPT 直接读这张表,下一步发什么命令一目了然,token 占用比 XML accessibility dump 少一个数量级。 特性 给 LLM 看的输出:hs ui 是 verb-led 表格,不是 XML dump,token 友好。 CSS-like + Playwright 风格 selector:Button:has-text("Sign in") / EditText:below(TextView[text=Email]) / Button:near(ImageView, 200),习惯 web 自动化的人零成本迁移。 毫秒级延迟:单次 tap typical ~80ms。最近把 tap 从「注入 MotionEvent」改成走 AccessibilityNodeInfo.ACTIONCLICK,绕开 InputDispatcher,p99 从 600ms+ 压到 ~50ms。 动作齐全:tap、type、fill(atomic ACTIONSETTEXT,绕过输入法)、swipe、wait、submit、paste、screenshot、screen mirror,还有 hs run 批处理脚本和 hs act --tap … --until … tap-then-assert 组合。 Python 绑定:pip install handsets,from handsets import Session。 无 root、无 APK:daemon 是个 jar 通过 appprocess 跑在 shell UID 下,权限够用。
Discuss this product