ANR 出现的场景,定位办法以及解决方案
1. 定义
Application not response,简称 ANR,即应用程序无响应。
当应用在5秒内对用户输入或点击等事件无响应时,Android便会认为应用无响应,弹出ANR 提示窗。
2. 原因
Android 应用在启动时会创建一个UI线程,该线程只负责 UI 界面更新,在该线程中进行耗时操作会导致线程阻塞,可能引起ANR。
3. 产生场景
- Activity 内对事件 5 秒无法完成处理;
- BroadcastReceiver 内对事件10秒无法完成处理;
- Service 的各个生命周期函数在特定时间(20秒)内无法完成处理;
4. 问题定位
-
logcat 分析崩溃日志;
-
当一个进程发生了ANR了以后,系统会在/data/anr目录下创建一个文件 traces.txt
adb pull /data/anr/traces.txt
5. 代码检测
-
使用Android SDK自带的 StrictMode(严格模式)进行检测
-
使用非侵入时的性能监控函数库 BlockCanary
-
非侵入式,简单的两行就打开监控,不需要到处打点,破坏代码优雅性。
-
精准,输出的信息可以帮助定位到问题所在(精确到行),不需要像Logcat一样,慢慢去找。
-
6. 解决
解决方案是对于耗时的操作,比如访问网络、访问数据库等操作,需要开辟子线程,在子线程处理耗时的操作,主线程主要实现UI的操作。
网友评论