Android 源码分析ANR

本文介绍了Android应用程序无响应(ANR)的概念,包括产生ANR的必要条件和常见场景。详细探讨了主线程处理输入事件超时导致ANR的过程,从InputReader到InputDispatcher,再到InputManagerService的事件传递路径,并分析了为何在特定情况下需要暂停输入事件传递以确保ANR检测的可靠性。
摘要由CSDN通过智能技术生成

先普及一下基本知识:

什么是ANR

ANR,是“Application Not Responding”的缩写,即“应用程序无响应”。在Android中,ActivityManagerService(简称AMS)和WindowManagerService(简称WMS)会监测应用程序的响应时间,如果应用程序主线程(即UI线程)在超时时间内对输入事件没有处理完毕,或者对特定操作没有执行完毕,就会出现ANR。对于输入事件没有处理完毕产生的ANRAndroid会显示一个对话框,提示用户当前应用程序没有响应,用户可以选择继续等待或者关闭这个应用程序(也就是杀掉这个应用程序的进程)。


产生ANR的三个必要条件

1.主线程

2.有输入事件

3.处理超时


产生ANR的情况

1.主线程对输入事件5秒没有处理完

2.主线程在执行BroadcastReceiveronReceive函数时10秒内没有执行完毕

3.主线程在执行Service的各个生命周期函数时20秒内没有执行完毕


产生ANR对于Android开发再熟悉不过了,每到它发生的时候,很影响用户体验,是一个很严重的问题,严重到必须要通过关闭整个进程才能让手机正常运行。第二种和第三种情况都不会弹出dialog提示,我们通过底层源码分析第一种情况ANR的产生。


事件传递的源头是InputReader,然后用InputDispatcher发送,我们看如何发送这个事件。


                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值