如何生成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