对于绝大数Android开发者都知道 ANR弹框,ANR全程是 Application Not Response。
在Android Q中 ANR窗口的构建是在 AppErrors.java 类中的 handleShowAnrUi(Message msg) 函数去做逻辑处理,
该对话框是一个继承 Dialog 的 AppNotRespondingDialog,AppNotRespondingDialog 负责了窗口的布局,输入事件等等行为,具体可以阅读 AppNotRespondingDialog.java.
这里需要抓住ANR一个关键函数 ProcessRecord.java 里的 appNotResponding(tring activityShortComponentName, ApplicationInfo aInfo,String parentShortComponentName, WindowProcessController parentProcess,
boolean aboveSystem, String annotation, boolean onlyDumpSelf) 该方法时发起ANR的唯一入口,而调用该接口的方法有
上述对应的常量:
对于service、provider、broadcast而言,可以在service 启动阶段发送一个延时message,然后在启动完成后removemessage
对于输入而言,就是通过时间差与超时时间进行比对,大于超时时间就弹框。
参考 InputDispatcher.cpp 里的 handleTargetsNotReadyLocked(…)以及 onANRLocked(…)方法