1. 什么是ANR
ANR(Application Not Response)是指在Android上,应用程序响应不够灵敏时,系统会向用户显示的一个对话框。 通俗点来说就是应用陷入无响应或者内存崩溃前,向客户进行提示的方式,帮助客户提前关闭卡死的应用,防止后续应用彻底卡死导致用户体验受到影响。
2. 为什么会有ANR现象
2.1. ANR的出现
当一名安卓开发人员遇到ANR现象,可能就是一个令人头疼的问题的开始。在Android中,一般情况下,四大组件均是工作在主线程中的,Android中的Activity Manager和Window Manager会随时监控应用程序的响应情况,如果因为一些耗时操作(网络请求或者IO操作)造成主线程阻塞一定时间,那么系统就会显示ANR对话框提示用户对应的应用处于无响应状态。如下图所示。
图1 ANR弹窗
2.2. ANR的诱因
从上面的描述我们可以看出常见的ANR问题,往往是你在主线程中加入了一些本该在子线程中的耗时操作。另外就是一些远端通讯或服务的binder流程,比如Binder被占满导致主线程无法和SystemServer通信,各进程间得不到系统资源(CPU/RAM/IO)导致死锁等。
就像是我们正在看热播的电视剧中,突然插播了一条广告,画面被广告占据播放,电视剧本身就无法正常继续播放;这与我们追剧的初衷不就背道相驰了。所以在实际使用中,要仔细考虑好主次线程的任务安排,避免本末倒置。
3. 如何排查ANR
首先,查看logcat日志是排查ANR问题的第一步。ANR事件会被记录在logcat中,通过连接设备并打开Android Studio的Logcat窗口,可以找到包含ActivityManager和ANR关键字的日志条目。这些日志包含了发生ANR的进程名称、堆栈跟踪和锁信息,帮助确定导致ANR的代码位置。
其次,分析ANR相关文件也是重要的一步。当ANR发生时,系统会生成三份记录文件:logcat日志文件、data/anr/目录下的anr文件**和data/system/dropbox目录下的system_app_anr压缩文件**。其中,system_app_anr文件提供了详细的超时信息和进程信息,是分析ANR问题的关键。
最后,系统性能监控也是排查ANR问题的重要手段。使用Perfetto轨迹文件**可以区分系统问题和应用问题,通过查看线程状态跟踪信息,了解应用的主线程是否被调度以及是否存在锁争用等问题。特别是输入调度超时,默认超时期限为5秒,主线程未及时响应输入事件会导致ANR,分析这些信息可以帮助定位问题。