
常见anr
input,点击事件:5秒;
contentprovider:10秒;
Broadcast:前台10秒,后台60秒;
服务 service:前台20秒,后台200秒
原理
埋炸弹和拆炸弹
当启动service的时候,会调用
scheduleCreateService方法创建service
app.thread.scheduleCreateService(r, r.serviceInfo,
mAm.compatibilityInfoForPackageLocked(r.serviceInfo.applicationInfo),
app.repProcState);
在创建过程中,利用handler发送延时消息,预埋炸弹
mAm.mHandler.sendMessageDelayed(msg, proc.execServicesFg ? SERVICE_TIMEOUT : SERVICE_BACKGROUND_TIMEOUT);
如果在延时时间内完成对应的操作,则handler会移除掉刚才的延时消息,拆除炸弹
mAm.mHandler.removeMessages(ActivityManagerService.SERVICE_TIMEOUT_MSG, r.app);
这种利用handler的延迟消息,埋炸弹和拆炸弹的设计思想,可以在日常开发中使用和借鉴。如watchdog就是使用该原理实现的
如果在规定的时间内炸弹没有被拆除,则会执行系统的appNotResponding方法,搜集当前堆栈信息,打印到控制台和写
Android ANR深度解析与性能优化实践

本文详细介绍了Android应用程序无响应(ANR)的常见类型、原理及监控方案,探讨了BlockCanary和watchdog等工具的改进。通过字节码插桩等技术实现精确的性能监控,并提出了线上环境的优化策略,旨在提升Android应用的性能和用户体验。
最低0.47元/天 解锁文章
1100

被折叠的 条评论
为什么被折叠?



