一、Crash
1.Java层crash
Java层的crash一般可以在日志中看到发生问题时的调用栈,比较容易定位问题。
2.Native层crash
Native层的crash一般只能看到发生问题时相关的地址和简单的原因,需要结合native的调用栈和日志中的上下文进行分析。
Linux Signal:对应Java层的Exception。
常见Signal:
| 信号 | 取值 | 默认动作 | 含义(发出信号的原因) |
|---|---|---|---|
| SIGABRT | 6 | Core | 来自abort的异常信号[Assert] |
| SIGSEGV | 11 | Core | 段非法错误(内存引用无效)[Segment fault] |
二、ANR
1.ANR检测原理
ANR(Application Not Responding)是指应用程序无响应,Android系统规定一些事件必须在一定时间范围内完成,如果超过预定时间未能得到有效响应或者响应时间过长,都会造成ANR。
ANR由消息处理机制保证,Android在系统层实现了一套精密的机制来检测ANR,核心原理是消息调度和超时处理。
2.ANR分析方法
1.分析ANR日志
搜索关键词:“ANR in”、“am_anr”,查看ANR的时间、进程、简单的原因、CPU使用情况。
搜索关键词:"cmd line.*com.tomorrow.test"(正则表达式),查看线程堆栈信息。
其他关键词:"MEMORY INFO"、"MEMINFO in pid.*com.tomorrow.test"(正则表达式)、"frames"、"strictmode"等。
2.分析是否native层crash导致ANR
- 搜索关键词:“Fatal signal”。
3.分析是否业务逻辑缺陷导致ANR
- 应用程序业务逻辑有缺陷,或者在某些异常场景触发了此缺陷,如主线程堵塞、死循环等。