ANR(Application Not Responding,即应用程序无响应)。在Android中,当应用程序在规定时间内没有处理完毕相应的事件,系统就会报出ANR。
ANR类型
- InputDispatchingTimedOut:应用程序主线程在5s内没有完成用户的input事件
- ServiceTimeout:应用程序没有执行完成service的bind/create/start/destroy/unbind操作,前台服务20s超时,后台服务200s超时
- BroadcastTimeout:应用程序在规定时间内没有执行完成onReceive操作,前台广播10s超时,后台广播60s超时
- ContentProviderTimeout:应用程序在20s内没有执行完成ContentProvider相关操作
产生原因
- 系统原因:由于Kernel/Framework/Driver等存在问题,导致系统不稳定最终表现出ANR
- 应用原因:主线程死锁、阻塞或者性能低下,需避免将耗时操作放在主线程
一、如何分析ANR?
ANR类的问题有些可以直接从日志中排查出原因,例如广播类ANR;有些可能因为系统不稳定(例如系统进程system server进程崩溃,CPU耗时,IO耗时,低内存等原因)导致很难定位。因此我们需要一套思路来分析定位ANR。
1、需要分析的日志
无论是MTK平台还是展锐平台,我们都需要如下关键信息的日志:
- Logcat
logcat属于android原生提供的抓取日志的方式。可以通过logcat来初步定位anr发声时间以及上下文系统或者各个进程状态。
MTK平台的AP日志中主要有main_log和sys_log,如果跟通信相关,还需要去查看radio_log。
展锐平台的AP日志中主要有android.log、android_main.log、android_system.log、android_radio.log。
- EventLog
envents也属于android原生提供的一种日志。通过这个日志可以很简洁的呈现出系统的事件处理流程,包括时间,状态,便于我们分析定位问题
MTK平台的AP日志中主要是events_log开头的文件;展锐平台AP日志中主要android_events.log。
【Android日志分析】EventLog_android event日志_xqliu2134的博客-CSDN博客
- MTK DB
MTK通过db的方式来记录系统发生的一切JE/NE/ANR相关的堆栈,如下图,但是需要通过mtk的专用工具才能解析。
- 展锐 Traces
展锐平台的AP日志中有专门traces文件夹,该文件夹存放了每一次ANR的堆栈调用,系统信息,文件格式为xx_xxx-xx_anr_xx_xx_xx。
2、分析流程
MTK和展锐官网都有详细说明如何分析ANR问题,但这里我更推荐展锐的分析思路。
-
展锐
- MTK
相比两种分析思路,大体流程类似,可以总结分为如下几个步骤:
- 确认ANR类型、时间、进程号
- 初步查看堆栈信息,分析主线程是否有明显的错误(定位是否应用原因)
- 如果主线程没有明显异常,在确认是否系统原因,重点关注CPU负债、内存信息、LMDK、IO是否阻塞、重要的系统进程(Zygote/system_server/ActivityManager等)有无明显异常
- 如果即没有定位应用自身原因,也没有定位到系统原因,那么需要结合上下文日志进行综合分析,如果还是没有什么头绪,这种情况可能是堆栈没有抓取出来,可能其他什么原因,建议可以给平台提case
1、确认ANR类型和相关信息
- MTK如何快速定位?
如果测试提供的日志有AEE目录,那么可以先检查db_history快速找到对应的db文件:
使用MTK的GAT工具加载db文件并解析:
- 展锐如何快速定位?
- 通过Logcat定位
二、常用Android相关机制
1、Signal Catcher线程
Android Runtime | Trace文件的生成机制_waitholdinglocks_小陈乱敲代码的博客-CSDN博客