ANR的简单介绍及产生原因
1. 什么是ANR
-
ANR(Application Not Responding)即应用程序无响应
-
为用户在 主线程长时间被阻塞时提供处理交互,提高用户体验
-
Android系统一种自身监测机制
2. ANR产生原因
ANR产生需要满足三个条件
- 主线程:只有应用程序进程的主线程 响应超时才会产生ANR;
- 超时时间:产生ANR的上下文不同,超时时间也不同,但只要超过这个时间上限没有响应就会产生ANR;
- 输入事件/待定操作:输入事件是指按键、触屏等设备输入事件、特点操作是指BroadcastReceiver和Service的生命周期中的各个函数调用;
ANR因为上下文不同,导致产生原因也不同,主要有三种情况:
- 应用进程的主线程(UI线程)对输入事件在5s内没有处理;
- 应用进程的主线程在执行BroadcastReceiver的onReceive函数时10s内没有处理完毕;
- 应用进程的主线程在执行service的各个生命周期函数时20s内没有处理完毕
引起ANR的根本原因,总的来说可以归纳为两类:
- 应用进程自身引起的,比如:主线程阻塞、挂起、死循环,执行耗时操作等;
- 其他线程引起的,比如:其他线程CPU占用率过高,导致当前应用进程无法抢占到CPU时间片。常见问题如文件读写频繁,io处理CPU占用率过高,导致当前应用出现ANR;