ANR 是Android中一个独立的概念,全称是Application Not Responding(应用程序无法响应)。
ANR产生的原因
只有当应用程序的UI线程响应超时才会引起ANR,超时的原因一般有2种:
- 当前的事件没有得到处理,例如UI 线程正在响应另一个事件,当前事件由于某种原因被阻塞了。
- 当前事件正在处理,但由于耗时太长没能及时处理完成
典型的ANR问题场景
- UI线程存在耗时操作,例如UI线程正在处理网络请求,数据库操作或文件读取等,导致UI线程无法及时处理用户输入。在Android4.0后,如果在进行网络请求会抛出异常
- 应用程序等待子线程释放某个锁,从而无法处理用户输入
- 耗时的动画要大量的计算工作,导致cpu负载过重
ANR的定位和分析
Logcat日志信息
logcat信息主要包含如下内容:
导致ARN的类名和包名
发生ARN的进程pid
ANR的原因
系统活跃进程的cpu占有率手机内部存储的/data/anr/traces.txt
adb pull /data/anr/traces.txt ~/Desktop/
通过命令行拉到桌面,打开可以开到导致ANR的堆栈信息,主要包含内容如下:
- 手机的cpu架构:arm
- 堆内存信息:Heap
- 主线程的基本信息