Monkey 入門指南
- 一、monkey環境搭建
- 1.1下載adb工具
操作步驟:
第一步:進入鏈接https://www.androiddevtools.cn/#,下載下圖中的包
1.2配置環境變量
操作步驟:
第一步:右擊我的電腦,查看屬性,然後在彈出的界面點擊“高級系統設置”
第二步:點擊“環境變量”
第三步:找到path,點擊編輯按鈕
第四步:點擊新建,添加platform-tools的路徑到環境變量,如下圖所示
第五步:點擊確定按鈕並退出
1.3環境驗證
1.3.1adb環境驗證
操作步驟:
第二步:輸入adb monkey
1.3.2連接真機
使用前提:
1 手機是可以正常使用的
2 使用的數據線必須是可以傳輸數據的(比如:購買充電寶所贈送的數據線只可以充電,不支持數據傳輸)
操作步驟:
第一步:usb剛連手機時會有彈窗“是否允許訪問手機數據”,點擊允許,打開通知導航欄,會顯示“使用usb傳輸文件”,如果不是,則手動選擇;
第二步:打開開發者選項中的允許usb調試,安卓各機型開啓開發者選項的方式不同,可根據自己的機型百度。
第三步:在cmd中輸入adb devices,如果顯示出設備名稱,則連接真機成功;
下載地址:https://www.yeshen.com/pg/yeshen
安裝完之後的使用步驟如下:
第一步:打開夜神多開器
第二步:點擊“添加模擬器”,設置不同的安卓系統版本
第三步:啓動模擬器
第四步:在cmd下使用adb devices 驗證模擬器是否可用
- 二、monkey的簡單介紹及使用
2.1 什麼是monkey
Monkey是Android中的一個命令行工具,通過Monkey程序模擬用戶觸摸屏幕、滑動、按鍵等操作來對應用程序進行壓力測試,檢測程序多久的時間會發生異常。
2.2 monkey測試的三個特點
Monkey測試,所有的事件都是隨機產生的,不帶任何人的主觀性。monkey測試有以下三個特點:
第一、測試的對象僅爲應用程序包,有一定的侷限性。
第二、Monky測試使用的事件數據流是隨機的,不能進行自定義。
第三、可對MonkeyTest的對象,事件數量,類型,頻率等進行設置。
2.3 monkey的運行
用法:adb shell monkey -p package.name -v times
分析:
-p表示對象包
–v 表示日誌級別
package.name 表示apk的包名
times 表示運行次數
實例:
運行方法一:在cmd下直接運行monkey命令:
adb shell monkey -p com.youdao.calculator -v 10
運行方法二:
adb shell
monkey -p com.youdao.calculator -v 10
備註:使用exit可以退出adb shell
備註:使用時推薦把monkey日誌保存下來,日誌保存參考4.1
2.4 如何找apk包名
2.4.1 使用aapt
aapt是sdk自帶的一個工具,在sdk\builds-tools\目錄下,本例子以xsteach.apk包爲例子。
操作步驟:
第一步:在sdk\builds-tools\目錄下進入cmd窗口
第二步:在cmd下運行aapt dump badging D:\apktools\xsteach.apk
第三步:找到apk的包名:com.xsteach.appedu
2.4.2 使用apktools
Apktools下載地址:
鏈接:https://pan.baidu.com/s/1bxEpXLicpw3MKFhPqJX_gw
提取碼:76cv
下載完直接使用,操作步驟如下:
步驟一:在apktools目錄下打開cmd
步驟二:在cmd下運行aapt dump badging xsteach.apk
步驟三:找到apk的包名:com.xsteach.appedu
- 三、monkey的常用參數
我們可以使用adb shell monkey -help 查看monkey有哪些命令參數,如果下圖所示:
3.1 參數: -p
用於約束限制,用此參數指定一個或多個包(Package,即App)。指定包之後,monkey將只允許系統啓動指定的APP,如果不指定包,將允許系統啓動設備中的所有APP.
* 指定一個包: adb shell monkey -p com.android.calendar 10
* 指定多個包:adb shell monkey -p com.android.calendar –p com.baidu.browser.apps -p com.tencent.wstt.gt 100
* 不指定包:adb shell monkey 100
3.2 參數: -v
用於指定反饋信息級別(信息級別就是日誌的詳細程度),總共分3個級別,分別對應的參數如下表所示:
日誌級別 Level0
示例 adb shell monkey -p com.android.calendar –v 10
說明缺省值,僅提供啓動提示、測試完成和最終結果等少量信息
日誌級別 Level 1
示例 adb shell monkey -p com.android.calendar –v -v 10
說明提供較爲詳細的日誌,包括每個發送到Activity的事件信息
日誌級別 Level 2
示例 adb shell monkey -p com.android.calendar –v -v –v 10
說明最詳細的日誌,包括了測試中選中/未選中的Activity信息
3.3 參數: -s
用於指定僞隨機數生成器的seed值,如果seed相同,則兩次Monkey測試所產生的事件序列也相同的。
Monkey 測試1:adb shell monkey -p com.android.calendar -s 10 100
Monkey 測試2:adb shell monkey -p com.android.calendar –s 10 100
兩次測試的效果是相同的,因爲模擬的用戶操作序列(每次操作按照一定的先後順序所組成的一系列操作,即一個序列)是一樣的。
3.4 延時參數: --throttle<毫秒>
用於指定用戶操作(即事件)間的時延,單位是毫秒;
adb shell monkey -p com.android.calendar --throttle 2000 10
備註:每隔2s執行一個隨機流時間,方便定位分析可能是在哪個屏幕出現crash
3.5 事件參數: --pct-{+事件類別}{+事件類別百分比}
11種事件:觸摸事件、手勢事件、二指縮放事件、軌跡事件、屏幕旋轉事件、基本導航事件、主要導航事件、系統按鍵事件、啓動Activity事件、鍵盤事件、其他類型事件。
用於指定每種類別事件的數目百分比(在Monkey事件序列中,該類事件數目佔總事件數目的百分比)
示例:
3.5.1 觸摸事件
--pct-touch{+百分比}
調整觸摸事件的百分比(觸摸事件是一個down-up事件,它發生在屏幕上的某單一位置)
adb shell monkey -p com.android.calenda --pct-touch 10 100
3.5.2 手勢事件
--pct-motion {+百分比}
調整手勢事件的百分比(動作事件由屏幕上某處的一個down事件、一系列的僞隨件機事和一個up事件組成)
adb shell monkey -p com.youdao.calculator --pct-motion 20 10
3.5.3 二指縮放事件
--pct-pinchzoom {+百分比}
調整二指縮放事件的百分比(二指縮放事件即智能機上的放大縮小手勢操作)
adb shell monkey -p com.youdao.calculator --pct-pinchzoom 30 10
3.5.4 軌跡事件
--pct-trackball {+百分比}
調整軌跡事件的百分比(軌跡事件由一個或幾個隨機的移動組成,有時還伴隨有點擊)
adb shell monkey -p com.youdao.calculator --pct-trackball 30 10
3.5.5屏幕旋轉事件
--pct-rotation {+百分比}
調整屏幕旋轉事件的百分比(橫屏和豎屏)
adb shell monkey -p com.youdao.calculator --pct-rotation 40 10
3.5.6 “基本”導航事件
--pct-nav {+百分比}
調整“基本”導航事件的百分比(導航事件由來自方向輸入設備的up/down/left/right組成)
adb shell monkey -p com.youdao.calculator --pct-nav 40 10
3.5.7“主要”導航事件
--pct-majornav {+百分比}
調整“主要”導航事件的百分比(這些導航事件通常引發圖形界面中的動作,如:5-way鍵盤的中間按鍵、回退按鍵、菜單按鍵)
adb shell monkey -p com.youdao.calculator --pct-majornav 50 10
3.5.8 “系統”按鍵事件
--pct-syskeys {+百分比}
調整“系統”按鍵事件的百分比(這些按鍵通常被保留,由系統使用,如Home、Back、Start Call、End Call及音量控制鍵)
adb shell monkey -p com.youdao.calculator --pct-syskeys 50 10
3.5.9 啓動Activity的百分比
--pct-appswitch {+百分比}
調整啓動Activity的百分比(在隨機間隔裏,Monkey通過調用startActivity方法最大限度地開啓該package下的全部Activity的一種方法)
adb shell monkey -p com.youdao.calculator --pct-appswitch 50 10
3.5.10 鍵盤事件
--pct-flip {+百分比}
調整鍵盤事件的百分比(鍵盤事件如點擊輸入框、鍵盤彈起、點擊輸入框以外區域、鍵盤收回等)
adb shell monkey -p com.youdao.calculator --pct-flip 50 10
3.5.11 其他類型事件
--pct-anyevent {+百分比}
調整其他類型事件的百分比(包羅了所有其他類型的時間,如按鍵、其他不常用的設備按鈕等)
adb shell monkey -p com.youdao.calculator --pct-anyevent 50 10
3.6 調試類參數:
通過調試類命令,可以對Monkey進行一些簡單的調試,可以快速定位Monkey執行過程中的一些問題。如果用戶想監控應用程序所調用的包之間的轉換,則可以用 –dbg-no-events參數;如果用戶想監控內存泄露,可以用—hprof參數。
3.6.1 –dbg-no-events
設置此選項,Monkey將執行初始啓動,進入一個測試Activity,不會再進一步生成事件。爲了得到最佳結果,把它與-v、一個或幾個包約束,以及一個保持Monkey運行30秒或更長事件的非零值聯合起來,從而提供一個可以監視應用程序所調用的包之間的轉換的環境
3.6.2 –hprof
將在事件執行之前和執行之後生成內存快照文件存放在手機的data/misc目錄。通過對比執行前後的內存快照文件,可以協助定位內存泄露問題。由於內存快照文件比較大,所有要小心使用。
3.6.3 參數: --ignore-crashes
用於指定當應用程序崩潰時(Force& Close錯誤),Monkey是否停止運行。如果使用此參數,即使應用程序崩潰,Monkey依然會發送事件,直到事件計數完成。
adb shell monkey -p com.youdao.calculatorr --ignore-crashes 10
測試過程中即使程序崩潰,Monkey依然會繼續發送事件直到事件數目達到10爲止
adb shell monkey -p com.youdao.calculator 10
測試過程中,如果app程序崩潰,Monkey將會停止運行
3.6.4 參數: --ignore-timeouts
用於指定當應用程序發生超時錯誤,如ANR(Application No Responding)錯誤時,Monkey是否停止運行。如果使用此參數,即使應用程序發生ANR錯誤,Monkey依然會發送事件,直到事件計數完成。
adb shell monkey -p com.youdao.calculator --ignore-timeouts 10
3.6.5 參數: --ignore-security-exceptions
用於指定當應用程序發生許可錯誤時(如證書許可,網絡許可等),Monkey是否停止運行。如果使用此參數,即使應用程序發生許可錯誤,Monkey依然會發送事件,直到事件計數完成。
adb shell monkey -p com.youdao.calculator --ignore-security-exceptions 10
3.6.6 參數: --kill-process-after-error
用於指定當應用程序發生錯誤時,是否停止其運行。
當Monkey由於一個錯誤而停止時,出錯的app將繼續處於運行狀態。
如果指定此參數,Monkey將會通知系統停止發生錯誤的進程。
(注意:應用程序僅是靜止在發生錯誤時的狀態,系統並不會結束該應用程序的進程)。
adb shell monkey -p com.youdao.calculator --kill-process-after-error 10
3.6.7 參數: --monitor-native-crashes
用於指定是否監視並報告應用程序發生崩潰的本地代碼。
adb shell monkey -p com.youdao.calculator --monitor-native-crashes 10
3.6.8 --wait-dbg
停止執行中的Monkey,直到有調試器和它相連接
3.7 官方隱藏類參數
3.7.1 –pkg-blacklist-file<黑名單文件>
限制Monkey不測試於指定黑名單文檔中記錄的包。
若沒有指定這個參數,Monkey將執行系統內所有的包。
3.7.2 –pkg-whitelist-file<白名單文件>
限制Monkey只測試於指定白名單文檔中記錄的包。
若沒有指定這個參數,Monkey將執行系統內所有的包。
3.7.3 –f
指定Monkey執行用戶自定義的腳本文件
- 四、Monkey日誌分析
4.1 保存日誌到指定目錄
4.1.1 保存到PC中
adb shell monkey -p com.youdao.calculator -v 100 >>d:\monkeylog.txt
-p :對象包
包名:com.youdao.calculator
-v :日誌級別
運行次數:1000
4.1.2 保存到手機中
第一步:在cmd下使用adb shell
第二步:monkey -p com.youdao.calculator -v 1000 > /mnt/sdcard/monkeylog.txt
-p :對象包
包名:com.youdao.calculator
-v :日誌級別
運行次數:1000
4.1.3 標準流和錯誤流分開保存
第一步:在cmd下使用adb shell
第二步:monkey -p com.youdao.calculator -v 1000 > /mnt/sdcard/monkeylog.txt > /sdcard/error.txt
-p :對象包
包名:com.youdao.calculator
-v :日誌級別
運行次數:1000
4.2 monkey日誌內容分析
4.2.1測試命令信息
#測試的命令信息
Events injected: 100
## Network stats: elapsed time=1186ms (0ms mobile, 0ms wifi, 1186ms not connected)
#隨機種子值,執行事件數量
:Monkey: seed=1568209983751 count=100
#運行的應用
:AllowPackage: com.youdao.calculator
#Category包含LAUNCHER和MONKEY
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
#各事件百分比
// Event percentages:
// 0: 15.0%
// 1: 10.0%
// 2: 2.0%
// 3: 15.0%
// 4: -0.0%
// 5: 25.0%
// 6: 15.0%
// 7: 2.0%
// 8: 2.0%
// 9: 1.0%
// 10: 13.0%
4.2.2 僞隨機流事件信息
#啓動app事件
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.youdao.calculator/.activities.MainActivity;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.youdao.calculator/.activities.MainActivity } in package com.youdao.calculator
#具體執行的動作、以及座標位置
:Sending Touch (ACTION_DOWN): 0:(655.0,235.0)
:Sending Touch (ACTION_UP): 0:(623.27386,154.98427)
:Sending Trackball (ACTION_MOVE): 0:(-5.0,4.0)
:Sending Touch (ACTION_DOWN): 0:(240.0,402.0)
:Sending Touch (ACTION_UP): 0:(219.07697,402.69543)
4.2.3 異常信息
無
4.2.4 如何判斷是否成功運行
4.2.4.1 判斷成功
//執行的事件數量
Events injected: 100000
//旋轉的角度爲0
:Sending rotation degree=0, persist=false
//丟失的事件數量
:Dropped: keys=0 pointers=160 trackballs=0 flips=0 rotations=0
//網絡狀態(移動網0ms,wifi網絡0ms,未連接359261ms)
## Network stats: elapsed time=359261ms (0ms mobile, 0ms wifi, 359261ms not connected)
// Monkey finished
4.2.4.2 判斷失敗
//顯示Monkey執行失敗
** Monkey aborted due to error.
//執行的事件數量
Events injected: 190
//丟失的事件數量
:Dropped: keys=0 pointers=11 trackballs=0 flips=0
//網絡狀態
## Network stats: elapsed time=27954ms (27954ms mobile, 0ms wifi, 0ms not connected)
//提示在執行到第190個事件時出現崩潰,用的種子隨機數是0
** System appears to have crashed at event 190 of 200 using seed 0
如果在執行monkey的過程中,出現Crash or ANR,error.txt中會顯示錯誤日誌。
五、如何重現異常
5.1 分析
排查步驟:
第一步:通過monkey找到是app的哪個模塊出錯(推薦使用延時參數throttle,這樣可以肉眼看到在哪個界面出現crash)
第二步:查看Monkey裏面出錯前的一些事件動作,並手動執行該動作
第三步:若以上步驟還不能找出,可以使用之前執行的monkey命令再執行一遍,注意seed值要一樣,方便重現
一般的測試結果分析:
1、ANR問題:在日誌中搜索“ANR”
2、崩潰問題:在日誌中搜索“Exception” Force Close
5.2 安卓常見的crash場景
Crash關鍵字 |
Crash原因 |
java.lang.NullPointerException |
空指針異常 |
java.lang.ArrayIndexOutofBoundsException |
數組溢出 |
java.lang.ClassNotFoundException |
類不存在 |
java.lang.ArithmeticException |
數學運算異常 |
java.lang.IllegalArgumentException |
方法參數異常 |
java.io.FileNotFoundException |
文件未找到 |
java.lang.NumberFormatException |
數值轉化異常 |
java.lang.StackOverflowError |
堆棧異常錯誤 |
java.lang.OutOfMemoryError |
內存溢出錯誤 |