編輯:關於Android編程
adb shell monkey -p com.test -v 30000 >E:\text.txt
adb shell monkey -p 包名 -v 執行次數 >導出的路徑
adb shell monkey -p com.lenovo.ideafriend –ignore-crashes –ignore-timeouts –ignore-native-crashes –pct-touch 30 -s 1 -v -v –throttle 200 100000 2>/sdcard/error.txt 1>/sdcard/info.txt
說明
測試結束後,需要將手機連接PC,拷貝以下文件:
info.txt:此文件在手機上的SDCARD中,主要記錄了MONKEY測試時發送的各種事件,如觸摸事件的位置等等。
error.txt:此文件在手機上的SDCARD中,主要記錄了MONKEY測試時產生的一些ANR、強制關閉等異常。
LOG文件:此文件在手機上的LOG文件夾中中,主要主要記錄程序對MONKEY測試時的響應情況。
代碼塊語法遵循標准markdown代碼,例如:
#monkey --help monkey [-p ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] ...] [-c MAIN_CATEGORY [-c MAIN_CATEGORY] ...] [--ignore-crashes] [--ignore-timeouts] [--ignore-security-exceptions] [--monitor-native-crashes] [--ignore-native-crashes] [--kill-process-after-error] [--hprof] [--pct-touch PERCENT] [--pct-motion PERCENT] [--pct-trackball PERCENT] [--pct-syskeys PERCENT] [--pct-nav PERCENT] [--pct-majornav PERCENT] [--pct-appswitch PERCENT] [--pct-flip PERCENT] [--pct-anyevent PERCENT] [--pkg-blacklist-file PACKAGE_BLACKLIST_FILE] [--pkg-whitelist-file PACKAGE_WHITELIST_FILE] [--wait-dbg] [--dbg-no-events] [--setup scriptfile] [-f scriptfile [-f scriptfile] ...] [--port port] [-s SEED] [-v [-v] ...] [--throttle MILLISEC] [--randomize-throttle] COUNT
常用參數解釋:
-p 後面跟要覆蓋測試的包名。可以有多個-p,每個-p後跟一個包名
-s 後面跟整數,相同的seed值表示產生的隨機事件流
-v 可以有多個,個數越多,產生的log越詳細,eg:2個時,可看到activity加載的時間
–gnore-crashes 應用crash時,不停止monkey執行
–pct* 調整各類事件所占的百分比,不常用
–throttle 後面跟毫秒數,表示每個隨機事件中間的時間間隔
COUNT 必選參數,表示運行隨機事件的個數Monkey監控並特殊處理的3個事件:
1、如果指定測試包時,限制測試在指定的包中;
2、如果應用crash或存在未捕獲的異常,monkey停止並報告錯誤;
3、如果應用產生ANR(application not responding)錯誤,monkey停止並報告錯誤。
產生ANR的兩個條件:
1、線程響應超過5s;
2、HandleMessage回調函數超過10s
以下屬於引用內容
1、 Null指針異常
空指針異常主要是有NullPointerException異常提示,在Monkey測試過程中,該信息一般記錄在plog.log (locat中也有該信息)中。
如果Monkey命令被中斷,說明有異常信息並且有對應的打印信息,可以看到如下信息,說明幾個問題:
A、android.process.acore該進程出現異常
B、異常信息主要是由於NullPointerException引起的,也就是出現了空指針,導致了acore進程進入debug
C、具體的可以繼續分析是由哪個函數的那一行導致的,如可以從rollAnimate3dRotate.java文件中的275行查找等。
//at com.android.launcher.LauncherAnimator.ScrollAnimate3dRotate.drawFrame(ScrollAnimate3dRotate.java:275)
D、可能同一應用中存在多處的空指針異常,所以一旦出現空指異常後,可以分析和對比log信息,如果不一致的話,需要把新的log信息也一同添加到bug中,如果log信息一直的話,則不需要繼續補充沒有必要的log信息。
// CRASH: android.process.acore (pid 1339)
// Short Msg: java.lang.NullPointerException
// Long Msg: java.lang.NullPointerException
// Build Label: android:FIH/msm7627_surf/msm7627_surf/F0X:1.6/DONUT/0001_0_020:e
ng/release-keys
// Build Changelist: -1
// Build Time: 1271397239
// ID:
// Tag: AndroidRuntime
// java.lang.NullPointerException:
//atcom.android.launcher.LauncherAnimator.ScrollAnimate3dRotate.drawFrame(ScrollAnimate3dRotate.java:275)
// at com.android.launcher.Workspace.dispatchDraw(Workspace.java:605)
// at android.view.ViewGroup.drawChild(ViewGroup.java:1524)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
// at com.android.launcher.DragLayer.dispatchDraw(DragLayer.java:258)
// at android.view.ViewGroup.drawChild(ViewGroup.java:1524)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
// at android.view.View.draw(View.java:6329)
// at android.widget.FrameLayout.draw(FrameLayout.java:352)
// at android.view.ViewGroup.drawChild(ViewGroup.java:1526)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
// at android.view.View.draw(View.java:6329)
// at android.widget.FrameLayout.draw(FrameLayout.java:352)
// at com.android.internal.policy.impl.PhoneWindowDecorView.draw(PhoneWindow.java:1901)
// at android.view.ViewRoot.draw(ViewRoot.java:1333)
// at android.view.ViewRoot.performTraversals(ViewRoot.java:1098)
// at android.view.ViewRoot.handleMessage(ViewRoot.java:1618)
// at android.os.Handler.dispatchMessage(Handler.java:99)
// at android.os.Looper.loop(Looper.java:123)
// at android.app.ActivityThread.main(ActivityThread.java:4203)
// at java.lang.reflect.Method.invokeNative(Method.java:-2)
// at java.lang.reflect.Method.invoke(Method.java:521)
// at com.android.internal.os.ZygoteInitMethodAndArgsCaller.run(ZygoteInit.java:799)
// at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
// at dalvik.system.NativeStart.main(NativeStart.java:-2)
** System appears to have crashed at event 7908 of 5000000 using seed 0
2、 debug異常
debug異常主要是由於應用程序本身的錯誤導致的異常。在Monkey測試過程中,該信息同樣記錄在plog.log (locat中也有該信息)中。一般情況下,出現的該問題,很可能在手動測試時也可以測試到。
A、 com.android.browser該進程進入debug
B、 出現的是IllegalStateException異常,該異常一般多是傳遞的參數非法或被多次調用時出現的異常
C、 Bug信息提交時,詳細信息中一般應該包含如下的log信息,方便開發人員分析和定位。
// CRASH: com.android.browser (pid 5683)
// Short Msg: Connection is not open
// Long Msg: java.lang.IllegalStateException: Connection is not open
// Build Label: android:FIH/msm7627_surf/msm7627_surf/F0X:1.6/DONUT/0001_0_020:eng/release-keys
// Build Changelist: -1
// Build Time: 1271397239
// ID:
// Tag: AndroidRuntime
// java.lang.IllegalStateException: Connection is not open
// at android.net.http.AndroidHttpClientConnection.assertOpen(AndroidHttpClien
tConnection.java:153)
// at android.net.http.AndroidHttpClientConnection.setSocketTimeout(AndroidHtt
pClientConnection.java:195)
// at android.net.http.Connection.openHttpConnection(Connection.java:364)
// at android.net.http.Connection.processRequests(Connection.java:225)
// at android.net.http.ConnectionThread.run(ConnectionThread.java:116)
* System appears to have crashed at event 34155 of 5000000 using seed 0*
3、 低內存異常
低內存異常一般情況下,主要表現在出現OutOfMemoryError異常或者提示Out of memory,其後果同樣表現為拋出OutOfMemoryError異常或者是通過kill process 來殺掉部分進程以釋放內存空間,當然如果被kill點關鍵的進程的話,也就可能導致部分應用會自動的退出。出現該情況時,主要是在進行頻繁的進行大量的操作導致的,所以使用手動的方式也是可能進行重現的。
A、 com.android.elastos.backup該進程出現的異常
B、 出現的是OutOfMemoryError異常,該異常一般多頻繁的操作(即多次調用某個函數,存在申請變量空間未釋放)導致的
C、 Bug信息提交時,詳細信息中同樣應該包含如下的log信息,方便開發人員分析和定位。
// CRASH: com.android.elastos.backup (pid 1581)
// Short Msg: bitmap size exceeds VM budget
// Long Msg: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
// Build Label: android:FIH/msm7627_surf/msm7627_surf/F0X:1.6/DONUT/0001_0_020:eng/release-keys
// Build Changelist: -1
// Build Time: 1271397239
// ID:
// Tag: AndroidRuntime
// java.lang.OutOfMemoryError: bitmap size exceeds VM budget
// at android.graphics.Bitmap.nativeCreate(Bitmap.java:-2)
// at android.graphics.Bitmap.createBitmap(Bitmap.java:464)
// at android.graphics.Bitmap.createBitmap(Bitmap.java:431)
// at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:336)
// at android.widget.AbsListView.preScaleBitmapBG(AbsListView.java:2354)
// at android.widget.AbsListView.draw(AbsListView.java:2365)
// at android.view.ViewGroup.drawChild(ViewGroup.java:1526)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
// at android.view.View.draw(View.java:6329)
// at android.view.ViewGroup.drawChild(ViewGroup.java:1526)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
// at android.view.View.draw(View.java:6329)
// at android.widget.FrameLayout.draw(FrameLayout.java:352)
// at android.view.ViewGroup.drawChild(ViewGroup.java:1526)
// at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
// at android.view.View.draw(View.java:6329)
// at android.widget.FrameLayout.draw(FrameLayout.java:352)
// at com.android.internal.policy.impl.PhoneWindowDecorView.draw(PhoneWindow.java:1901)
// at android.view.ViewRoot.draw(ViewRoot.java:1333)
// at android.view.ViewRoot.performTraversals(ViewRoot.java:1098)
// at android.view.ViewRoot.handleMessage(ViewRoot.java:1618)
// at android.os.Handler.dispatchMessage(Handler.java:99)
// at android.os.Looper.loop(Looper.java:123)
// at android.app.ActivityThread.main(ActivityThread.java:4203)
// at java.lang.reflect.Method.invokeNative(Method.java:-2)
// at java.lang.reflect.Method.invoke(Method.java:521)
// at com.android.internal.os.ZygoteInitMethodAndArgsCaller.run(ZygoteInit.java:799)
// at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
// at dalvik.system.NativeStart.main(NativeStart.java:-2)
** System appears to have crashed at event 143290 of 100000000 using seed 0#
或者出現plog信息的最後出現如下log信息也可能存在同樣問題:
<3>[56351.640641] Out of memory: kill process 14177 (app_process) score 247872 or a child
<3>[56351.641121] Killed process 14177 (app_process)
4、 操作無響應異常
操作無響應的問題,主要表現在Monkey運行過程中,出現某功能無響應,提示是否“強制關閉“或“等待“,同時會打印出相應的log信息,如下:
A、 可以說明com.android.soundrecorder該進程出現的無響應
B、 出現的是TimerOut異常,該異常一般出現時一般都會又keyDispatchingTimedOut提示
C、 目前,uPhone手機中經常出現操作無響應的幾個模塊包括:clock、camera、soundrecorder、broser等,根據開發人員分析其他模塊也是有可能出現操作無響應的,測試過程中,請多注意。
D、 出現無響應異常,一般情況下很難被修復,和發送事件的頻率也是有關系的,從質量上來要求的話,要求盡可能的減少出現操作無響應的頻率和時間。
// NOT RESPONDING: com.android.soundrecorder (pid 1931)
ANR in process: com.android.soundrecorder (last in com.android.soundrecorder)
Annotation: keyDispatchingTimedOut
CPU usage:
Load: 8.24 / 8.41 / 8.25
CPU usage from 35911ms to 83ms ago:
com.android.soundrecorder: 4% = 3% user + 0% kernel / faults: 997 minor 43 maj
or
mediaserver: 2% = 2% user + 0% kernel / faults: 267 minor 3 major
android.process.media: 2% = 0% user + 1% kernel / faults: 563 minor 194 major
system_server: 1% = 1% user + 0% kernel / faults: 1279 minor 5 major
com.cootek.touchpal: 0% = 0% user + 0% kernel / faults: 180 minor 1 major
sensorserver_ya: 0% = 0% user + 0% kernel / faults: 47 minor 1 major
mmcqd: 0% = 0% user + 0% kernel
app_process: 0% = 0% user + 0% kernel / faults: 203 minor 1 major
com.fihtdc.brservice: 0% = 0% user + 0% kernel / faults: 29 minor
kswapd0: 0% = 0% user + 0% kernel
com.android.settings: 0% = 0% user + 0% kernel / faults: 266 minor
port-bridge: 0% = 0% user + 0% kernel / faults: 19 minor
rpcrouter: 0% = 0% user + 0% kernel
com.android.mms: 0% = 0% user + 0% kernel / faults: 135 minor 8 major
TOTAL: 13% = 8% user + 4% kernel + 0% iowait
procrank:
PID Vss Rss Pss Uss cmdline
1209 35368K 25376K 15283K 14036K system_server
1342 32788K 24596K 14899K 14136K android.process.acore
……
// procrank status was 0
anr traces:
// meminfo status was 0
** System appears to have crashed at event 59034 of 5000000 using seed 0
5、 其他異常
A、 Restart System異常(系統重新啟動),即log信息的最後幾行會看到Restart System的打印信息,說明手機被自動的重啟或斷掉,有幾個方面的原因
1、 運行過程中,存在異常手機被自動重啟
2、 手機在運行過程中,進入設置中的恢復出場設置,導致手機重啟
3、 其他原因,如果手機後蓋移動等
B、 RuntimeException等異常,同樣的會在plog.log中可以看到相應的打印信息, java.lang.RuntimeException該問題多出現在操作無響應之後,或者是某應用的服務無法啟動或連接時,需要具體問題具體的分析
C、 StaleDataException、readException等異常, 在plog.log中可以看到相應的打印信息,也會有相應的信息: android.database.StaleDataException,該信息說明android的數據庫操作出現異常, 需要具體問題具體的分析
D、 IllegalArgumentException等異常,多少情況下為說明向函數傳遞了一個不正確或不合法的參數需要具體問題具體的分析
E、 其他,帶補充和分析說明
說明幾點:
1、 log信息的分析,希望在bug信息的簡述中能夠明確說明清楚出現的是什麼異常,具體的log信息要單獨添加到詳細信息描述中,方便相關人員定位和查看。
2、 bug的提交,對於Monkey測試出現的問題:
a、 首先要求分析log信息
b、 再次要確認該bug是否已經提交?已經提交的bug和新運行出來的問題是否一致?
c、 如果不一致的話,是否屬於同一問題,如空指針異常,是的話就把該問題的log信息一起注釋到bug信息中,並添加所有的log信息
d、 如果不一致的,也不屬於同一問題的話,可以提交新的bug
3、 在java編程中,一般的異常都會拋出xxx Exception的信息,可以跟進xxx進行相關的判斷和分析,具體的異常則需要具體問題具體分析。
歡迎關注,謝謝
https://github.com/yufan2014
從Android的官方開發者博客找了一份幻燈片,介紹了一些Android UI設計,我們把這個教程整理出來,希望大家喜歡。為開發者,為啥我們要關心UI,前面
概述:Snackbar提供了一個介於Toast和AlertDialog之間輕量級控件,它可以很方便的提供消息的提示和動作反饋。有時我們想這樣一種控件,我們想他可以想Toa
有時候用Eclipse想按住ctrl鍵查看源碼怎麼辦? 下面具體步驟讓你輕松看源碼: 點擊android.jar下面的source: 這裡可以添加zip和文件夾,zi
一,shiro授權 授權流程:跟用戶的認證流程類似,shrio在用戶授權的時候,最後還是去Realm獲取信息。 shiro的三種授權方式: