前言¶
在 DSH 裏做自動化,經常需要「看一眼手機屏幕」。scrcpy 本身能把安卓畫面投到電腦,但它是命令行工具:要記參數、要判斷當前是 USB 還是無線、要查手機的 IP、手機重啓之後還要重新 adb tcpip。每一步都能做,每一步都要人手動判斷。
gem-gti/dsh-scrcpy-mirror 做的事情就是把這些判斷封裝成一個 DSH 插件,讓模型可以通過 phone_mirror 工具直接啓動投屏、查狀態、截圖。下面介紹它提供了哪些能力、怎麼裝、怎麼用。
這是什麼¶
由 gem-gti 維護的客戶端類插件,基於 scrcpy 把安卓手機畫面投到 Windows 電腦。它本身不含客戶端部分,只提供工具與命令:
- 給模型用的
phone_mirror工具,支持status/start/stop/connect/screenshot - 給使用者用會話命令
/mirror,不經過模型,直接在輸入框執行
平臺與宿主要求¶
- 僅 Windows(依賴 scrcpy.exe / adb.exe)
- 宿主:DeepSeek Harness
>=0.2.0-rc.1 <0.3.0-0 - 本機需已安裝 scrcpy,
package.json裏engines.node要求>=20
核心功能¶
phone_mirror 工具的各 action:
| action | 做什麼 |
|---|---|
status |
查看 scrcpy/adb 路徑、當前網關、5555 端口是否開放、已授權設備、正在運行的投屏進程 |
start |
啓動投屏:USB 優先,沒有 USB 就自動讀網關走無線 |
stop |
結束投屏進程 |
connect |
開啓 5555 並連上無線(手機重啓後必須跑一次) |
screenshot |
通過 adb exec-out screencap 截一張手機屏幕,返回 PNG 路徑 |
除了給模型用的工具,插件還註冊了一個會話命令,在輸入框直接敲即可:
/mirror 啓動投屏(等同 start)
/mirror stop 停止投屏
/mirror status 查看設備與連接狀態
/mirror connect 手機重啓後重連無線
/mirror screenshot 截一張手機屏幕
命令走 Host 側的 ctx.commands.register,結果以純文本顯示在會話裏。
安裝與啓用¶
以下命令來自插件 README,均爲 PowerShell。先選其中一種安裝方式,再重啓 DSH 或在插件頁啓用 phone-mirror。
本地目錄(開發調試):
dsh plugin --profile desktop add "D:\path\to\dsh-scrcpy-mirror"
本地 tarball:
npm pack
dsh plugin --profile desktop add ".\mu-dsh-scrcpy-mirror-0.2.0.tgz"
從 npm 安裝(發佈後):
dsh plugin --profile desktop add dsh-scrcpy-mirror
社區市場:發佈到 npm 並被目錄源(如 DSH 1024Store)收錄後,在 DSH 的「社區市場 → 可安裝」裏搜索 Phone Mirror 點擊安裝即可。
典型用法¶
安裝後在對話裏直接說「幫我看看手機投屏狀態」「開一下手機投屏」「手機重啓了,無線連不上了」「截一張手機屏幕給我」,模型會依次調用:
{ "action": "status" }
{ "action": "start" }
{ "action": "connect" }
{ "action": "screenshot" }
status 的返回示例(節選自 README):
scrcpy: C:\Users\...\scrcpy.exe
adb: C:\Users\...\adb.exe
網關(連着手機熱點時即手機 IP): 10.99.177.119
網關 5555 端口: 開放
設備:
- VCJFK7WSLNS8TOEQ(USB)
- 10.99.177.119:5555(無線)
投屏進程: 127224
這個例子本身說明了它將手機 IP 推斷成網關:連着手機熱點時,網關即手機地址。
配置¶
cordis.patch.yml 裏該行的 config 可以覆蓋默認值:
- insert:
- id: phone-mirror
name: dsh-scrcpy-mirror
config:
maxSize: "1280" # 畫面最長邊,越大越清晰
bitRate: "6M" # 視頻碼率;USB 可 8M,無線建議 4M~6M
audioSource: output # output=抓全系統聲音且手機靜音 / playback / mic
turnScreenOff: true # 手機熄屏但投屏繼續
alwaysOnTop: true # 投屏窗口置頂
shortcutMod: lctrl # 快捷鍵修飾鍵:lctrl(推薦)/ lalt
adbPort: 5555
scrcpyPath: "" # 留空則自動在 winget 目錄與 PATH 中查找
adbPath: ""
前置條件¶
1、電腦裝好 scrcpy:
winget install --id Genymobile.scrcpy
2、手機開啓「開發者選項 → USB 調試」。
3、首次插線時在手機上點「允許 USB 調試」。
4、想無線投屏:電腦連手機熱點(或同一 WiFi),跑一次 connect。
實現說明¶
插件調用外部命令(adb / ipconfig / tasklist / taskkill / scrcpy)時不使用管道,而是用 spawn + 文件句柄直寫臨時文件再讀取。原因是 DSH 宿主可能在受限沙箱裏運行插件工具,管道式 stdio 會被直接拒絕(spawn EPERM),表現爲「命令靜默失敗、設備永遠查不到」。
手機 IP 的推斷也不是隻靠 IPv4 默認網關——README 提到小米/澎湃熱點常常只下發 IPv6 網關,所以回退順序是:IPv4 網關 → DHCP 服務器(就是手機)→ 同網段 .1。
適用場景與注意¶
適合在 Windows 上用 DSH 做 Android 相關自動化的開發者:需要讓模型能主動查看手機畫面、截圖,或讓使用者不經過模型也能一鍵投屏。
幾點需要注意:
- 僅 Windows 可用,
taskkill/ipconfig/ winget 路徑都按 Windows 實現。 - 插件以當前 dsh 進程權限運行,安裝前應檢查源碼與許可證(本項目爲 MIT,投屏能力來自 Apache-2.0 的 scrcpy,本項目不打包其二進制,僅調用本機已安裝版本)。
- 手機重啓後無線必然失效,這是 adb 的限制,需要插一次線跑
connect。 - 小米/澎湃機型上,scrcpy 自帶的「點亮屏幕」快捷鍵常被系統攔掉,插件不提供喚醒,需要按手機電源鍵。
- 投屏窗口是 scrcpy 自己的窗口,不在 DSH 界面內。
- README 還說明了一點:該插件不含客戶端部分,原因是 DSH 的自定義 Host 服務需要 Typert 編譯器生成的
./typert入口才能被remote.xxx訪問,手寫 bundle 沒有該產物,客戶端注入會一直等待並拖垮整個前端啓動。所以本插件只提供工具與命令。
結尾¶
這個插件把 scrcpy 的命令行操作收斂成一個工具和一個命令,適合 Windows 上需要讓模型直接查看/操作 Android 畫面的場景。目錄頁見 https://www.skillhub.cn/plugins/gem-gti/dsh-scrcpy-mirror,源碼見 https://github.com/gem-gti/dsh-scrcpy-mirror。