dsh-plugin-android-tools:通過本地 HTTP 橋接驅動 Android 界面

前言

在 DeepSeek Harness(dsh)裏做手機相關任務時,模型需要能「看見當前界面」並執行點擊、輸入、返回等操作。常見做法是用 ADB 腳本或單獨寫一套 RPC,再把能力封裝成工具註冊進智能體;維護成本高,且和 Harness 的插件模型不一定對齊。

下面介紹社區插件 dsh-plugin-android-tools(維護者 asdukw,SkillHub 分類:工作流)。它把設備側的 UI 自動化橋接成一組 dsh 工具:讀屏、截圖、點按、長按、輸入、系統鍵、啓動應用、滑動,必要時還可經 Termux 橋執行 shell。插件本身是跨平臺的 HTTP 客戶端,真正讀 UI 樹和注入手勢由 bridge host 實現;倉庫只提供客戶端,不包含已發佈的 Android host,需自行指向已有 host 或按契約自寫。

這是什麼

dsh-plugin-android-tools 是 DeepSeek Harness 插件:註冊原子 UI 工具,每次調用轉發到配置了 ANDROID_BRIDGE_URL 的 bridge host。host 可參考 Android AccessibilityService 實現,任何能按同一 HTTP 契約響應的系統均可對接。

未配置 bridge 或 token 時,工具調用會明確失敗,而不是靜默空操作。

核心功能

插件向模型暴露的工具如下(能力以 host 實現爲準;插件只轉發 HTTP):

工具 作用
read_ui_tree 導出當前界面節點樹,行格式如 [12] TextView "Send" clickable @(900,2200)
tap_node(ref) 點擊上一次 read_ui_tree 中的節點 ref
capture_screenshot() 抓取一幀:圖像及尺寸、screenshot_id 等 frame 信息
tap_target(screenshot_id,x1,y1,x2,y2) 在截圖像素 bbox 上點擊(host 負責座標換算)
long_press_target(...) 對截圖目標長按(默認 700 ms,可選 300–2000 ms)
long_press(ref,...) 對 UI 樹節點長按
type_text(text) 向當前焦點輸入框寫入文本(不自動發送)
press(key) back / home / recents / enter
launch_app(query) 按模糊名稱或包名啓動應用
swipe(direction) 約半屏滑動:up / down / left / right
run_command(cmd,timeout_ms?) 在手機 Linux 環境(Termux + proot Debian)執行 shell,返回 stdout / stderr / 退出碼

說明:

  1. UI 類工具(除 run_command 外)是可逆、可見的界面操作;run_command 改文件系統、無撤銷,且每次調用獨立會話(cd、環境變量、後臺進程不保留),也沒有 docker / systemd / iptables 等真實內核能力。
  2. run_command 僅在 host 注入 TAPPET_TERMUX_URL 與 TAPPET_TERMUX_TOKEN 時註冊;未配置 Termux 橋的 host 不會出現該工具。
  3. capture_screenshot 的圖像經 ctx.attachments 附件服務交給模型;未掛載附件服務時調用仍成功,但圖像以文本降級、模型收不到圖。bridge 返回的 action payload 形態爲 { mediaType, width, height, base64 } 等。

Bridge 側統一契約:POST {ANDROID_BRIDGE_URL}/action,請求頭 x-android-bridge-token: <ANDROID_BRIDGE_TOKEN>,body 含 action 與參數;成功 { "ok": true, "payload": "…" },失敗 { "ok": false, "summary": "…" }。建議 bridge 監聽本機並校驗 token:屏內容可能含個人數據,且 bridge 可直接驅動設備。

安裝與啓用

安裝命令以倉庫 README 爲準(安裝後需重啓 dsh;包內 dsh.bundle / cordis.patch.yml 會在安裝時寫入插件行):

# from git, pinned to a release tag:
dsh plugin add github:asdukw/dsh-plugin-android-tools#v0.3.0

# or from the tarball attached to any GitHub Release:
dsh plugin add ./dsh-plugin-android-tools-0.3.0.tgz

# once npm publishing is enabled:
dsh plugin add dsh-plugin-android-tools

配置

在啓動 dsh 的環境中設置(host 啓動器通常也會注入):

變量 含義
ANDROID_BRIDGE_URL Bridge 基址,例如 http://127.0.0.1:37812
ANDROID_BRIDGE_TOKEN 每次請求校驗的共享 token
TAPPET_TERMUX_URL 手機 Linux 橋 URL,例如 http://127.0.0.1:8899(可選)
TAPPET_TERMUX_TOKEN 上述橋的 token(與上一項成對出現)

缺少 ANDROID_BRIDGE_URL 或 ANDROID_BRIDGE_TOKEN 時,各工具調用會報未配置錯誤。

典型用法

推薦循環:先讀屏,再操作,再讀屏確認。

User: open the clock app and set a 5 minute timer
Agent: launch_app("Clock") → read_ui_tree → tap_node(12) → type_text("5") → …

無真機時可先用倉庫自帶的 mock host 驗證插件與 token 鏈路:

node examples/mock-host.mjs   # mock host on http://127.0.0.1:37812 (token: dev-token)
export ANDROID_BRIDGE_URL=http://127.0.0.1:37812
export ANDROID_BRIDGE_TOKEN=dev-token

mock 會確認各 action 並返回 canned 的 read_ui_tree。

若要自寫 host,README 給出 checklist:校驗 token、將 action 映射到平臺無障礙/自動化 API、read_ui_tree 保持 [ref] 在兩次讀取間穩定以便 tap_node 等。參考實現見 examples/mock-host.mjs(約 60 行,展示解析/鑑權/回覆形狀)。

適用場景與注意

適合誰

  • 已在 dsh 中編排智能體,需要把 Android(或其它實現了同一契約的平臺)UI 操作收成標準工具的人。
  • 願意維護或部署 bridge host,並接受 loopback + token 的安全模型的人。
  • 需要在手機 Termux/proot 環境跑命令、且 host 已配置 Termux 橋的場景(慎用 run_command)。

注意

  1. 插件以當前運行 dsh 的進程權限與環境工作;安裝前請閱讀源碼與 MIT 許可證,確認 bridge URL、token 與日誌策略符合你的安全要求。
  2. 倉庫不發佈 Android host 成品;只有 HTTP 客戶端與 mock。生產環境需自備 host 或第三方實現。
  3. 插件無 OS 特定代碼,換平臺只需寫 bridge host,不必改插件。
  4. SkillHub 爲社區插件目錄,與 DeepSeek / 幻方無官方從屬關係;星標與版本以 GitHub 與目錄頁爲準(安裝示例中 git tag 爲 v0.3.0,倉庫 package.json 當前版本爲 0.6.0,按你的發佈物選擇對應安裝方式)。

結尾

dsh-plugin-android-tools 把「讀 UI、點按、輸入、系統導航、截圖定位、可選 shell」收斂成 Harness 可調用的工具面,通過本地 HTTP bridge 與 host 解耦。要上手:安裝插件並配置 bridge 環境變量,host 就緒後按「讀—做—再讀」讓模型組合原子操作即可。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜