input keyevent
會改變裝置按下實體或虛擬按鍵——Home、Back、電源、音量、Enter。
- 指令
- adb shell input keyevent
- 指令
- 輸入與觸控
- 風險
- 會改變裝置
語法
input [-d <displayId>] keyevent [--longpress | --duration <ms>] [--doubletap] [--async] [--delay <ms>] <code or name> [<code or name> ...]旗標與參數
| token | 意義 |
|---|---|
| <code> | 按鍵代碼的數字。新版也接受名稱,但數字到哪裡都通——而這個差別不只是好不好看。`InputShellCommand.runKeyEvent` 用 `KeyEvent.keyCodeFromString` 把參數解析出來,然後看都不看就送出去,所以一個這個版本不認識的名稱會解析成 `KEYCODE_UNKNOWN`,照樣被注入:沒有錯誤、沒有效果、結束碼是 0。隔壁的 `keycombination` 子指令會檢查同一個值並丟出 `Unknown keycode:`,`keyevent` 不會。數字不會這樣失敗。後面可以接不只一個代碼,它們會照順序送出。 |
範例
input keyevent 3Home。
input keyevent 4Back。
input keyevent 26電源——鎖住或喚醒螢幕。
input keyevent 187近期使用/多工鍵。
輸出怎麼讀
什麼都沒有。手機會反應或不反應,兩種都沒有確認訊息。這種沉默正是這一頁把篇幅花在失敗表而不是輸出上的原因:送出一個沒人在聽的按鍵之後它回傳 0;因為你打的名稱這個版本不認識而送出 `KEYCODE_UNKNOWN` 之後,它也回傳 0。唯一誠實的確認是去看——拍一張 `screencap`,或用 `dumpsys`、`getprop`、`settings get` 把你想改的狀態讀回來——並且把「沒有錯誤訊息」當成完全沒有證據。時間相關的開關是 `keyevent` 唯一會回話的地方:`--longpress` 按住平台自己的長按逾時、`--duration <ms>` 按住你指定的時間、`--doubletap` 用平台最小的雙擊間隔把同一個代碼送兩次,而 `--delay <ms>` 則是把一次呼叫裡的一串代碼拉開間隔。
輸出欄位
| 欄位 | 意義 |
|---|---|
| (no output) | 按鍵事件已注入。 |
需要什麼權限
不用 root,也不用 `adb root`。`input` 是一行的 shell 腳本,跑的是 `cmd input "$@"`(AOSP 的 `cmds/input/input.sh`),所以事件是以已授權 `adb` 連線另一端的 `shell` 使用者身分注入的。這個身分買到的東西刻意很窄:`runKeyEvent` 只接受按鍵代碼、那幾個時間開關,以及一個可選的 `-d <displayId>`,沒有別的——沒有參數能指名目標 app,所以按鍵沒辦法瞄準某個視窗。它會落到那個顯示器上、在它抵達那一瞬間握有焦點的東西身上,這讓腳本的順序與節奏遠比任何權限重要。除了 USB 偵錯本身,這一頁沒有任何東西被開發者選項的開關擋著。
失敗訊息對照
| 訊息 | 意義 |
|---|---|
| --duration and --longpress cannot be used at the same time. | 兩個都給了。`runKeyEvent` 把這行印在 stderr 然後丟例外,所以一個按鍵都不會送出。`--longpress` 是一個把持續時間設成平台長按逾時的預設組合,再另外指定時間,就等於讓指令手上有兩個答案——挑一個丟掉。 |
| Error: Invalid arguments for command: keyevent | 它要一個數字,但來的是別的東西。`--delay` 與 `--duration` 都把參數當 long 解析,而 `onCommand` 會把因此產生的 `NumberFormatException` 變成這一行,後面接上子指令名稱。要看的是開關後面那個值,不是按鍵代碼。 |
| cmd: Can't find service: input | `cmd` 找不到 `input` 服務可以把子指令交出去。裝置還在開機、`system_server` 還沒登記它的時候,這是預期中的——和 `pm` 找不到 `package` 服務時的失敗長得一樣。 |
會改變什麼,以及怎麼回頭
單獨看都無害,但有些代碼是有後果的:26 是電源鍵,所以它會鎖住或喚醒螢幕;送進錯誤 app 的按鍵就是一次你沒打算做的點擊。這裡沒有破壞性的東西,也沒有需要還原的東西。
版本與廠商注意事項
- 這一家族使用的代碼(已對照平台自己的按鍵事件定義):3 Home、4 Back、19 與 20 D-pad 上下、24 與 25 音量上下、26 電源、61 Tab、66 Enter、67 Delete、75 單引號、82 Menu、187 多工。
- 按鍵會送給取得焦點的那個東西。如果從你上次看之後跳出了對話框,收到的就是它。
這個我們有 UI
Android ADB Toolbox 會透過 USB 執行這個指令並解析回應——只要 Chromium 系瀏覽器,不必安裝 SDK,也不會上傳任何東西。
相關指令
和 input keyevent 會在同一次作業裡出現的指令。
| 指令 | 做什麼 |
|---|---|
| input text | 把一段字串打進目前取得焦點的輸入欄位。 |
| getevent | 直接從核心串流原始輸入事件,或列出每個輸入裝置能回報什麼。 |
| screencap | 擷取螢幕畫面,可以寫進手機裡的檔案,也可以把 PNG 送到標準輸出。 |
這些行為是在撰寫 Web ADB 工具背後的解析程式時,對照 AOSP、toybox 與核心原始碼查證的。真的會因 Android 版本或廠牌而異的地方,這一頁會直接說明,而不是給你一個在半數手機上都是錯的數字。