Android 自动化测试-Monkey Log 分析

如何生成Monkey Log

使用Linux Shell 输出重定向功能, 可参考菜鸟教程
如:

//保存在电脑
adb shell monkey -p com.android.settings  500 >d:\xxx.txt   
//保存在手机上
adb shell monkey -p com.android.settings  500 >/sdcard/monkey_log

Log 关键词

:Monkey: seed=732041 count=999999999 其中的seed就是种子数。只要知道种子数,就能同样的崩溃或者ANR 就能复现。 count 是次数
:AllowPackage: com.android.settings 测试的app
:IncludeCategory: android.intent.category.LAUNCHER // 启动activity 的Category,这两个是monkey 默认的,如果需要添加其它的Category,使用-c 参数添加。
:IncludeCategory: android.intent.category.MONKEY

:Switch

表示Activity切换,Monkey 注入事件中的MonkeyActivityEvent通过发送intent来注入,注入的时候会输出log,以:Switch:开头,后面跟intent.toUri(0)。 由于该intent Category指定了是Intent.CATEGORY_LAUNCHER,这种方式启动的Activity 限定是你桌面生成快捷方式启动的那个activity。

接下来会输出以下文字,来表示是否注入MonkeyActivityEvent成功。

Allowing/Rejecting start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=“packagename”/.launcher.LauncherActivity } in package ”packagename“.

这个输出是依靠监听IActivityController.Stub 的activityStarting()方法实现的。

// NOT RESPONDING

出现了ANR(appNotResponding),此时会输出”// NOT RESPONDING: ” + processName + ” (pid ” + pid + “)”,然后输出进程信息。

// NOT RESPONDING: “packagename” (pid 3043)
ANR in “packagename”, time=20748620
Reason: executing service “packagename”/”servicename”
Load: 6.16 / 6.6 / 6.53
Android time :[2018-01-09 03:28:25.96] [20752.447]
CPU usage from 12295ms to 0ms ago:
99% 3043/ “packagename”: 8.6% user + 91% kernel / faults: 5744 minor 19 major
1.9% 4870/ “packagename”: 1.3% user + 0.6% kernel / faults: 208 minor
0.8% 950/system_server: 0.7% user + 0% kernel / faults: 727 minor 29 major
0.2% 203/mtk charger_hv_: 0% user + 0.2% kernel
0.1% 7/rcu_preempt: 0% user + 0.1% kernel
0.1% 71/kswapd0: 0% user + 0.1% kernel
0.1% 162/mmcqd/0: 0% user + 0.1% kernel
0.1% 202/bat_thread_kthr: 0% user + 0.1% kernel
0.1% 1625/com.android.phone: 0.1% user + 0% kernel / faults: 70 minor
0% 8/rcu_sched: 0% user + 0% kernel
0% 57/cfinteractive: 0% user + 0% kernel
0% 100/present_fence_w: 0% user + 0% kernel
0% 238/logd: 0% user + 0% kernel / faults: 11 minor
0% 255/surfaceflinger: 0% user + 0% kernel / faults: 199 minor
0% 1155/com.android.systemui: 0% user + 0% kernel / faults: 126 minor
0% 16280/kworker/0:2: 0% user + 0% kernel
25% TOTAL: 3% user + 22% kernel + 0% iowait

同时通过查看/data/anr/traces.txt 文件来定位问题,最新生成的在最前面。

adb pull /data/anr/traces.txt traces.txt

按照monkey中输出pid 在traces中查找该进程。然后找其中的主线程,定位原因。如

“main” prio=5 tid=1 TIMED_WAIT

// WATCHDOG:

出现了SNR (System not responding), 输出

// WATCHDOG: 相关信息

一般这种情况和app没什么关系

//CRASH:

输出信息如:

//CRASH:processname(pid 13419)
Short Msg: java.lang.NullPointerException
Long Msg: java.lang.NullPointerException
Build Label: …
Build ChangeList: ….
Build Time: ..
//java.lang.NullPointerException
// at android.view.GestureDetector
// at android.os.Handler.dispatchMessage(Handler.java:102)

如何复现

1.方法一

打开系统设置,开发者选项的指针位置,手机上能够显示相对的X和Y坐标。 根据Log先定位到ANR出现的地方,向上寻找第一个Activity启动的时候输出的log。然后按照之后log日志输出的进行操作。
Activity启动log

// Allowing start of Intent { cmp=”packageName”/”activity”} in package “packageName”

Activity resume log

// activityResuming(“packageName”)

2.方法二

按照种子数seed重新跑一遍Monkey, 由于Monkey 生成的伪随机事件,所以只要种子相同,产生的事件也是相同的

获取更多信息

获得更多信息可以在sdk下寻找Bugreport, 这些文件命名规则为:

ANR 报告: anr_ +mReportProcessName+_+.txt
WatchDog 报告: anr_watchdog_.txt
Crash 报告: app_crash+mReportProcessName+_+.txt
Native Crash 报告: 如果配置了–monitor-native-crashes参数,生成native_crash_.txt
定期报告: 如果配置了–periodic-bugreport 参数,是定期生成报告的,此时的报告名称为Bugreport_.txt

    原文作者:邓璨荣
    原文地址: https://www.jianshu.com/p/2aaf07241eca
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞