使用 Monkey 向 Android 裝置精確傳送事件
Monkey 是一個 Android 裝置(模擬器或真實裝置)上的一個程式,可以產生大量隨機的使用者輸入事件,如點選、觸控、手勢等。因此 Monkey 可用於 UI 上的壓力測試。例如,下面的命令會啟動一個特定的 app 併發送 500 個隨機的事件:
adb shell monkey -p your.package.name -v 500
然而,Monkey 程式還有一個特殊的--port
選項。當這個選項開啟後,Monkey 會執行在Automated Network Control
模式下,可以精確地向 app 傳送一些KeyEvent
和MotionEvent
。這也提供了一種在adb shell input
命令之外,程式性地傳送使用者事件的方法。經測試,Monkey 支援的使用者事件比input
命令的使用者事件更細緻一些。
如果你有 AOSP 原始碼,可以在development/cmds/monkey/
目錄下找到 README.NETWORK.txt 檔案,其中有說明Automated Network Control
協議的簡單文件。或者你可以訪問這裡
。
下面簡單概括一下文件內容:
建立連線
monkey --port
命令會讓 monkey server 執行起來,並監聽特定的埠:
adb shell monkey --port 1080
那麼我在 host 機器上就可以通過 TCP 連線來向 monkey server 傳送命令。注意 monkey server 只會繫結 localhost。TCP 協議是 ADB 支援的,因此需要設定埠轉發:
adb forward tcp:1080 tcp:1080
這樣就可以向 monkey server 傳送命令了。
協議格式
不同的命令之間通過換行來分隔。對於正常完成的命令,monkey 會回覆 OK;否則會回覆 ERROR。如果命令有返回值,返回值會放在與 OK 或 ERROR 的同一行,以冒號分隔。ERROR 回覆的返回值一般是錯誤訊息。下面是一個請求-響應序列的例子:
key down menu OK touch monkey ERROR: monkey not a number getvar sdk OK: donut getvar foo ERROR: no such var
命令列表
wake
喚醒裝置,以接收使用者輸入
touch [down|up|move] x y
傳送一個MotionEvent ,模擬使用者點選螢幕。x 和 y 是相對於左上角的座標。如果要模擬滑動事件的話,可以先 touch down,然後 touch move,最後 touch up。
tap x y
是 touch 命令的簡化版,相當於一次 touch down 和一次 touch up。
key [down|up] keycode
傳送一個KeyEvent
。keycode 既可以是文字也可以是整數值,例如KeyEvent.KEYCODE_MENU = 82
,那麼傳送 82 或者 “KEYCODE_MENU” 都可以。
press keycode
是 key 命令的簡化版,相當於一次 key down 和一次 key up。
type string
模擬使用者的鍵盤輸入,通過生成 KeyEvent 來實現。