1.获取日志
当在测试过程中发现闪退、崩溃、卡顿等问题时,可通过如下命令获取对应的日志并记录大概发生时间
adb logcat -d -v threadtime,color > /Users/wan/Downloads/Log/c1.txt
adb bugreport -d -v threadtime,color > /Users/wan/Downloads/Log/a1.txt
2.分析日志
得到日志后,可以根据包名和“start proc”确定被kill掉的进程号
cat c1.txt|grep -i "start proc"|grep -i "vidma.video.editor.videomaker"
根据上一步的进程号,筛选出与这个进程有关的所有日志,并定位到进程kill前的最后一刻
以4903进程为例,过滤日志如下,可以看到出现问题的原因
其他日志例子
3.Crash和ANR总结
1)进程被kill场景总结
-
低内存查杀:有“lmkd”关键词
-
不明原因被kill:有“signal 9”关键词
-
系统内部崩溃:有F级别的日志和“Fatal”关键词
-
App线程崩溃:有“FATAL EXCEPTION”关键词
2)Crash问题总结
Crash产生原因
内存管理问题:内存不足、内存泄露、内存未授权
程序问题:数组越界、堆栈溢出、并发操作、逻辑问题
常见Exception:
-
算术异常类:ArithmeticExecption
-
空指针异常类:NullPointerException
-
类型强制转换异常:ClassCastException
-
数组负下标异常:NegativeArrayException
-
数组下标越界异常:ArrayIndexOutOfBoundsException
-
违背安全原则异常:SecturityException
-
文件已结束异常:EOFException
-
文件未找到异常:FileNotFoundException
-
字符串转换为数字异常:NumberFormatException
-
操作数据库异常:SQLException
-
输入输出异常:IOException
-
违法访问错误:IllegalAccessError
-
内存不足错误:OutOfMemoryError
-
堆栈溢出错误:StackOverflowError
设备兼容:设备多样性
网络兼容:网络切换等
日志分析思路
1)根据“FATAL EXCEPTION””关键词过滤Crash日志
2)确定Crash发生的进程号、类型
3)定位到具体原因
3)ANR问题总结
ANR分类
-
Input dispatching timed out:输入时间分发超过5s,包括按键和触屏事件;
-
Broadcast of Intent:前台广播需要在10s内完成,后台广播需要在60s内完成;
-
executing service:前台服务需要在20s内完成,后台则需要在200s内完成;
-
ContentProvider:非常少见,publish执行未在10s内完成;
-
Context.startForegroundService():应用调用startForegroundService,5s内未调用
startForeground出现ANR或者Crash,此问题属于应用未适配Android版本sdk;
ANR产生原因
-
主线程存在耗时操作:主线程阻塞(Blocked)、挂起(suspend)、死锁、死循环、耗时操作等;
-
CPU资源被抢占:其他进程某一时间点CPU占比高、某一刻系统的CPU占比过高;
-
主线程卡在binder通信的对端:需要通过binderinfo查看对端信息;
-
系统或者应用自身可用内存紧张:系统一直在执行Lowmemorykiller操作查杀进程;
-
应用频繁Crash:包括应用自身也容易导致前台应用出现ANR的现象;
-
应用内存泄露;
-
系统原因导致:如冻结、温度过高、多媒体(音视频、编解码)、包管理、Block I/O、Native Crash、
watchdog、内存黑洞、芯片能力等;
日志分析思路
1)根据“ANR in””关键词过滤ANR日志
2)确定ANR发生的进程号、类型
3)查看CPU和内存使用情况
典型实例
-
Block I/O
-
GPU渲染
-
应用适配SDK
-
相机模块遇到的问题
-
音频模块遇到的问题
-
APK签名认证
-
无焦点窗口
-
内存泄漏
-
Binder耗尽
-
barrier阻塞
-
消息过量
-
内存不足
-
应用死锁
-
自身NE导致
-
权限拦截
-
park锁耗时
-
cpu时间片不足
-
空进程
-
芯片性能不足