(一)Monkey簡介
Monkey意指猴子,頑皮淘氣。所以Monkey測試,顧名思義也就像猴子一樣在軟件上亂敲按鍵,猴子什么都不懂,就愛搗亂。
Monkey 是 Android SDK 自帶的命令行工具,它通過向系統發送偽隨機的用戶事件流(如點擊、滑動、按鍵等),對正在運行的應用程序進行壓力測試。
Monkey 測試的核心原理基于 Android 系統的事件驅動機制。它生成的事件被發送到系統的事件隊列中,然后由系統分發到相應的應用程序。這些隨機事件的組合模擬了用戶在使用應用時可能進行的各種操作,以此來檢測應用在不同操作序列下的表現。
Monkey包括許多選項,它們大致分為四大類:
(1)基本配置選項,如設置嘗試的事件數量;
(2)運行約束選項,如設置只對單獨的一個包進行測試;
(3)事件類型和頻率;
(4)調試選項;
(二)Money原理
在Monkey運行的時候,它生成事件,并把它們發給系統。同時,Monkey還對測試中的系統進行監測,對下列三種情況進行特殊處理(自動停止):
(1)如果限定了Monkey運行在一個或幾個特定的包上,那么它會監測試圖轉到其它包的操作,并對其進行阻止;
(2)如果應用程序崩潰或接收到任何失控異常,Monkey將停止并報錯;
(3)如果應用程序產生了應用程序不響應(application not responding)的錯誤,Monkey將會停止并報錯;
按照選定的不同級別的反饋信息,在Monkey中還可以看到其執行過程報告和生成的事件。
(1)Monkey程序由Android系統自帶,使用Java語言寫成,在Android文件系統中的存放路徑是:/system/framework/monkey.jar;
(2)Monkey.jar程序是由一個名為“monkey”的Shell腳本來啟動執行,shell腳本在Android文件系統中的存放路徑是:/system/bin/monkey;
(3)通過在cmd窗口中執行: adb shell monkey {+命令參數}來進行Monkey測試;
(三)Monkey命令詳解
首先我們需要有adb工具,如果沒有可以參考?ADB環境配置?,完成工具安裝,熟悉操作環境。
首先,我們需要先知道待測APP的包名,我們可以直接使用adb命令獲取包名,先打開進入需要獲取包名的APP,再輸入命令:
adb shell
dumpsys activity | grep mFocus
基本語法:
adb shell monkey [options] <event-count>
- ?adb shell:進入設備shell
- monkey:啟動Monkey工具
- [options]:配置參數
- <event-count>:事件數量(如10000)
常用參數說明:
參數 | 說明 | 示例 |
-p <包名> | 指定測試的應用包名 | -p com.android.settings |
-s <種子> | 指定隨機數種子,便于復現問題 | -s 123 |
--throttle <毫秒> | 設置事件時間間隔 | --throttle 500 |
-v / -vv / -vvv | 設置日志詳細程度(最多三級) | -vvv |
--ignore-crashes | 忽略崩潰繼續執行 | --ignore-crashes |
--ignore-timeouts | 忽略ABR錯誤繼續執行 | --ignore-timeouts |
--monitor-natvie-crashes | 監控native層崩潰 | --monitor-native-crashes |
--pct-touch <百分比> | 設置觸摸事件比例 | --pct-touch 50 |
--pct-motion <百分比> | 設置滑動事件比例 | --pct-touch 30 |
--pct-appswitch <百分比> | 設置應用切換事件比例 | --pct-appswitch 10 |
--pct-rotation <百分比> | 設置屏幕旋轉事件比例 | --pct-rotation 5 |
--bugreport | 自動生成bugreport日志 | --bugreport |
> log.txt | 將日志輸出到文件 | > /sdcard/monkey_log.txt |
示例命令:
adb shell
monkey -p com.android.settings --throttle 500 -v -v -v --ignore-crashes --ignore-timeouts --pct-touch 50 -pct-motion 30 10000 > /sdcard/monkey_log.txt
含義:對 com.android.settings 執行10000次monkey測試,事件間隔500ms,日志詳細,忽略奔潰與超時,觸摸事件占50%,滑動事件占30%,并將日志保存為/sdcard/monkey_log.txt文本
注意:adb shell進入后,只能讀取到設備的文件路徑,例如/sdcard/
如果是adb shell monkey -p?com.android.settings -v 10000 >?F:\monkey_log.txt? 就可以訪問本電腦路徑,將log直接保存到本電腦
(四)應用場景
1. App穩定性測試(壓力測試)
目的: 模擬用戶連續操作,驗證App是否會崩潰、閃退或無響應
應用場景:
- App發布前的穩定性驗證
- 回歸測試階段,確保舊功能未被新版本影響
- 夜間持續運行Monkey,觀察長時間運行后的表現
示例命令:
adb shell monkey -p com.exmaple.app --throttle 300 -v -v -v 10000
每300ms發送一次事件,共10000次,記錄詳細日志
2. Bug復現與定位
目的:通過設置相同的隨機種子,復現Monkey觸發的異常
應用場景:
- 某次Monkey測試發現崩潰,需復現問題
- 開發修復后,驗證是否已解決
示例命令:
adb shell monkey -p com.example.app -s 1752714219455 -v -v -v 10000
使用種子 1752714219455 復現崩潰場景
3. 整機穩定性測試
目的:測試系統級穩定性,包括多App切換、系統按鍵響應等
應用場景:
- Android系統ROM測試
- 智能硬件整機測試(如電視盒子、車載設備)
示例命令:
adb shell monkey --pct-syskeys 20 --pct-appswitch 30 -v 1000
增加系統按鍵和App切換事件比例,模擬整機使用場景
4. 安全性與異常處理測試
目的:驗證App在權限異常、奔潰、ANR等情況下的處理能力
應用場景:
- 檢查是否有未捕獲異常
- 驗證ANR彈窗是否出現
- 測試App是否能恢復運行
示例命令:
adb shell monkey -p com.example.app --ignore-crashes --ignore-timeouts --monitor-native-crashes -v 10000
即使發生崩潰或者ANR,Monkey繼續執行,便于收集更多異常
5. CI自動化集成測試
目的:將Monkey測試集成到持續集成流程,定期執行穩定性驗證
應用場景:
- 每次構建后自動執行Monkey測試
- 結合logcat分析異常日志
- 自動生成測試報告
示例命令:
adb shell monkey -p com.example.app --throttle 500 -s 2025 -v 10000 >/sdcard/monkey_log.txt
將日志輸出到設備,供后續分析
(五)實戰演練
這是我輸入monkey -p com.android.settings -v 10000 進行monkey的測試結果
這段日志表明 Monkey 測試異常終止,核心信息是 “系統在執行到第 9647 個事件時崩潰”,具體分析如下:
1. 關鍵日志解讀
Monkey aborted due to error
:Monkey 測試因錯誤強制終止,未完成預設的 10000 個事件。Events injected: 9647
:實際成功注入 9647 個事件,距離目標 10000 個僅差 353 個。System appears to have crashed at event 9647
:崩潰發生在第 9647 個事件,且可能是系統級崩潰(而非單一應用崩潰)。seed 1752714219455
:測試使用的隨機數種子,可用于復現崩潰場景(用相同種子重新執行命令,大概率會在同一事件序列觸發崩潰)。elapsed time=267988ms
:測試總耗時約 268 秒(4 分 28 秒),平均每個事件間隔約 27.8 毫秒(若未設置--throttle
,Monkey 會以最快速度發送事件)。
2. 崩潰原因分析
(1)系統級崩潰
- 表現:日志明確提到 “
System appears to have crashed
”,說明不是單一應用(如com.android.settings
)崩潰,而是整個 Android 系統出現嚴重錯誤(如進程卡死、內存溢出、內核 panic 等)。- 可能誘因:
- 連續高頻率事件導致系統資源耗盡(CPU 100%、內存溢出)。
- 某一事件觸發了系統底層漏洞(如框架層代碼缺陷、驅動兼容性問題)。
- 設備硬件限制(如低端設備無法承受密集事件壓力)。
(2)Monkey 自身限制
- 若測試中涉及跨應用操作(即使指定了
-p
包名,某些系統事件仍可能觸發其他應用),可能導致 Monkey 無法處理的異常。- 部分定制 ROM(如廠商修改的系統)對 Monkey 支持不佳,密集事件可能觸發系統保護機制(如 watchdog 超時)。
(3)事件序列沖突
- 第 9647 個事件可能是一個特殊操作組合(如連續快速點擊 + 旋轉屏幕 + 按鍵),觸發了系統未處理的邊緣場景(如 UI 線程阻塞、資源競爭死鎖)。
3. 復現與排查建議
(1)復現崩潰場景
使用相同種子重新執行測試,確認是否穩定復現:
adb shell monkey -p com.android.settings -s 1752714219455 -v -v 10000
- 若復現,說明是確定性問題(與事件序列強相關)。
- 若偶爾出現,可能是偶發的資源競爭問題。
(2)收集系統崩潰日志
- 測試時同時記錄
logcat
系統日志,捕獲崩潰瞬間的堆棧信息:adb shell logcat -v time > crash_log.txt # 實時保存日志
- 重點查找關鍵字:
AndroidRuntime: FATAL EXCEPTION
(應用崩潰)ANR in
(應用無響應)kernel: panic
(內核崩潰)Watchdog: *WATCHDOG*
(系統 watchdog 超時,通常是嚴重阻塞)
4. 總結
????????此問題的核心是密集事件觸發了系統級崩潰,需通過相同種子復現問題,結合logcat
抓取崩潰堆棧,定位具體是系統資源耗盡、代碼漏洞還是硬件限制導致。通過降低事件頻率、優化事件類型,可臨時規避這個問題