输出日志报的点不一定是问题所在。ANRManager处理超时是不会管具体超时原因的,任何超时都会导致正在处理的app进程抛anr出来,但是有可能和app没有任何关系,anr的出口肯定是app,抛出anr的app只是正好撞在了枪口上。“发生 ANR 时,没有一个消息是无辜的。”
原因:
主线程阻塞的
开辟单独的子线程来处理耗时阻塞事务.CPU满负荷, I/O阻塞的
I/O阻塞一般来说就是文件读写或数据库操作执行在主线程了, 也可以通过开辟子线程的方式异步执行.内存不够用的
增大VM内存, 使用largeHeap属性, 排查内存泄露(这个在内存优化那篇细说吧)等.
分析:
- Trace 日志
- AnrInfo
- Kernel 日志
- Logcat 日志
- Meminfo 日志
- Raster 监控工具
监控:
-
多消息聚合:
该场景主要用于主线程连续调度多个消息,并且每个消息耗时都很少的情况下,将这些消息耗时累加,直到这些消息累计耗时超过设置的阈值,则汇总并生成一条记录,并在这条记录中标明本次聚合总共调度了多少个消息。按照消息聚合的思路,发生问题时主线程消息调度示意图如下:
完整示意图
参考
- https://mp.weixin.qq.com/s/_Z6GdGRVWq-_JXf5Fs6fsw
- https://mp.weixin.qq.com/s?__biz=MzI1MzYzMjE0MQ==&mid=2247488116&idx=1&sn=fdf80fa52c57a3360ad1999da2a9656b&chksm=e9d0d996dea750807aadc62d7ed442948ad197607afb9409dd5a296b16fb3d5243f9224b5763&token=569762407&lang=zh_CN&scene=21#wechat_redirect
- https://www.jianshu.com/p/388166988cef
- https://www.jianshu.com/p/6d855e984b99
- https://developer.android.com/topic/performance/vitals/anr