Monkey是Android中的一個命令行工具,可以運行在模擬器里或實際設備中。它向系統發送偽隨機的用戶事件流(如按鍵輸入、觸摸屏輸入、手勢輸入等),實現對正在開發的應用程序進行壓力測試。
先來看一條monkey命令
adb shell monkey -p ctrip.android.view --throttle 500 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v 100000>e:\monkeylog\monkeyScreenLog.log
這條monkey命令是指:在ctrip.android.view中產生10萬次偽隨機操作(包括觸摸、按鍵、手勢等),每次間隔500ms。
monkey命令參數說明:
-s
偽隨機數生成器的 seed 值。
示例: -s 600(如果用相同的seed值再次運行monkey,它將生成相同的事件序列。)
--throttle
在事件之間插入固定延遲。
示例: --throttle 500(毫秒)
-p
如果用此參數指定了一個或幾個包,Monkey將只允許系統啟動這些包里的Activity。 如果你的應用程序還需要訪問其它包里的Activity(如選擇取一個聯系人),那些包也需要在此 同時指定。如果不指定任何包,Monkey將允許系統啟動全部包里的Activity。要指定多個 包,需要使用多個 -p選項,每個-p選項只能用於一個包。
示例:-p ctrip.android.view
--kill-process-after-error
通常,當Monkey由於一個錯誤而停止時,出錯的應用程序將繼續處於運行狀態。當設置了此選項時,將會通知系 統停止發生錯誤的進程。注意,正常的(成功的)結束,並沒有停止啟動的進程,設備只是在結束事件之 后,簡單地保持在最后的狀態。
--ignore-timeouts
通常,當應用程序發生任何超時錯誤(如“Application Not Responding”對 話框)時,Monkey將停止運行。如果設置此選項,Monkey將繼 續向系統發送事件,直到計數完成。
--ignore-security-exceptions
通常,當應用程序發生許可錯誤(如啟動一個需要某些許可的Activity)時,Monkey將 停止運行。如果設置了此選項,Monkey將繼續向系統發送事件,直到計數完成。
-v
命令行的每一個 -v 將增加反饋信息的級別。 3個-v代表最詳細的日志級別。
示例:-v -v -v 100(數字100: 表示測試事件數)。
詳情請參考:monkey命令參數
自動化實例
#coding=utf-8 import os import sys import time class monkeyTest(): def __init__(self): """ init """ #monkey命令,packageName包名,interval間隔時間單位ms ,frequency執行次數 def monkeyApp(self,packageName,interval,frequency): try: os.popen("adb shell monkey -p %s --throttle %s --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v %s >e:\monkeylog\monkeyScreenLog.log" % (packageName, interval, frequency),'r') except Exception,e: print e #導出日志 def copyErrorLog(self): try: anr = "E:\\monkeylog\\anr" if not os.path.isdir(anr): os.makedirs(anr) dontpanic = "E:\\monkeylog\\dontpanic" if not os.path.isdir(dontpanic): os.makedirs(dontpanic) tombstones = "E:\\monkeylog\\tombstones" if not os.path.isdir(tombstones): os.makedirs(tombstones) bugreports = "E:\\monkeylog\\bugreports" if not os.path.isdir(bugreports): os.makedirs(bugreports) os.popen("adb pull /data/anr E://monkeylog//anr",'r') os.popen("adb pull /data/dontpanic E://monkeylog//dontpanic",'r') os.popen("adb pull /data/tombstones E://monkeylog//tombstones",'r') os.popen("adb pull /data/data/com.android.shell/files/bugreports E://monkeylog//bugreports",'r') except Exception,e: print e def main(): print """""" if __name__=="__main__": packageName = 'ctrip.android.view' myApp = monkeyTest() myApp.monkeyApp(packageName,500,100) #判斷是否執行完成,執行完成后導出日志 for i in range(1, 1000000): monkeylog = open('E:\monkeylog\monkeyScreenLog.log') try: temp = monkeylog.read( ) finally: monkeylog.close( ) if temp.count('Monkey finished')>0: myApp.copyErrorLog() break else: time.sleep(2)
以上做到了自動執行monkey命令,並在monkey執行完成后將日志導出到PC以供分析。
如何通過日志定位問題
Android平台應用程序可能產生以下四種Crash:
App層:
1、Force Close Crash
2、ANR Crash
Native層:
3、Tombstone Crash(Native Crash)
Kernel層:
4、Kernel Panic
主要Log文件說明
anr目錄:從手機/data/anr導出的日志,保存發生anr crash 時的相關信息;
dontpanic目錄:從手機/data/dontpanic/導出的日志,保存發生Kernel Panic時的相關信息;
Tombstone目錄:從手機/data/tombstones/導出的日志,保存發生Tombstone Crash時的錯誤信息;
dropbox目錄:從手機/data/tombstones/導出的日志,經過dropbox服務截取的部分tombstones錯誤信息;
bugreports.log:從手機data/data/com.android.shell/files/bugreports導出的日志,保存發生異常時的相關系統信息,也可以通過adb shell bugreport命令提取;
MonkeyScreenLog.Log:保存Monkey測試過程、應用層錯誤信息,發生Native Crash時,在此文件也會有記錄;
LOG分析方法
1、在MonkeyScreen.Log日志文件搜索關鍵詞“Fatal”、“Crash”、“ANR”定位到發生Crash的詳細堆棧信息,通過上下文初步判斷發生問題的時間,進程pid等
2、檢查dropbox目錄下是否有相關crash日志信息,主要關注是否有以下4類crash錯誤信息:data_app_wtf,data_app_anr,data_app_crash,system_server_watchdog