標籤:crash 包名 逾時 ctr 單位 utf-8 工具 import 錯誤
1、monkey命令簡介
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。
2、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命令參數
3、自動化執行個體
1 #coding=utf-8 2 3 ‘‘‘ 4 Create on 2014-12-24 5 python 2.7 for window 6 @auther: tangdongchu 7 ‘‘‘ 8 import os 9 import sys10 import time11 12 class monkeyTest():13 14 def __init__(self):15 """ init """16 17 #monkey命令,packageName包名,interval間隔時間單位ms ,frequency執行次數18 def monkeyApp(self,packageName,interval,frequency):19 try:20 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‘)21 except Exception,e:22 print e23 24 #匯出日誌25 def copyErrorLog(self):26 try:27 anr = "E:\\monkeylog\\anr"28 if not os.path.isdir(anr):29 os.makedirs(anr)30 dontpanic = "E:\\monkeylog\\dontpanic"31 if not os.path.isdir(dontpanic):32 os.makedirs(dontpanic)33 tombstones = "E:\\monkeylog\\tombstones"34 if not os.path.isdir(tombstones):35 os.makedirs(tombstones) 36 bugreports = "E:\\monkeylog\\bugreports"37 if not os.path.isdir(bugreports):38 os.makedirs(bugreports) 39 os.popen("adb pull /data/anr E://monkeylog//anr",‘r‘)40 os.popen("adb pull /data/dontpanic E://monkeylog//dontpanic",‘r‘)41 os.popen("adb pull /data/tombstones E://monkeylog//tombstones",‘r‘)42 os.popen("adb pull /data/data/com.android.shell/files/bugreports E://monkeylog//bugreports",‘r‘)43 except Exception,e:44 print e 45 46 def main():47 print """"""48 49 50 if __name__=="__main__":51 52 packageName = ‘ctrip.android.view‘ 53 myApp = monkeyTest() 54 myApp.monkeyApp(packageName,500,100)55 #判斷是否執行完成,執行完成後匯出日誌56 for i in range(1, 1000000):57 monkeylog = open(‘E:\monkeylog\monkeyScreenLog.log‘)58 try:59 temp = monkeylog.read( )60 finally:61 monkeylog.close( )62 if temp.count(‘Monkey finished‘)>0:63 myApp.copyErrorLog()64 break65 else:66 time.sleep(2)
以上做到了自動執行monkey命令,並在monkey執行完成後將日誌匯出到PC以供分析。
4、如何通過日誌定位問題
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
LOG分析樣本
使用MonkeyTest對Android用戶端進行壓力測試 自動化代碼