最近项目报了我负责的模块有ANR日志让我解决,但是看来看去,虽然日志里面存在如下日志,但整体进程未看到出现异常,主线程也都在正常打印,且后面几十分钟也依然在打印日志,没有死,所以查找资料分析ANR流程:
system_server: libdebuggerd_client: started dumping process 1466
1.ANR出现的情况(broadcastTimeoutLocked、serviceTimeout、serviceForegroundTimeout、inputDispatchingTimedOut、appNotRespondingViaProvider)
比较重要的一点是isSilentAnr()函数,如果返回false会dump getLruProcessList()获取的所有进程.
我的进程被dump根据日志和isSilentAnr()函数的分析,应该是systemui出现ANR导致的所有进程被dump.日志里面找到这个打印印证
07-16 00:59:32.039 921 28886 I ActivityManager: dumpStackTraces pids={1587=true, 1650=true, 1799=true, 2071=true, 2401=true, 2444=true, 2477=true, 2513=true, 2564=true, 2619=true, 2662=true, 2724=true, 2820=true, 2914=true, 2948=true, 3010=true, 3071=true, 3105=true, 3516=true, 3547=true, 3633=true, 3672=true, 3711=true, 3838=true, 3888=true, 3948=true, 4139=true, 4222=true, 4333=true, 4449=true, 4489=true, 4527=true, 4583=true, 4739=true, 4834=true, 5249=true, 5423=true, 5563=true, 5638=true, 5654=true, 5749=true, 5783=true, 5998=true, 6368=true, 26344=true, 28527=true, 28552=true, 28655=true, 28665=true, 28718=true, 28751=true, 28863=true} nativepids=[285, 397, 399, 500, 534, 796, 798, 813, 814, 815, 821, 826, 3010]
2.某些进程需要定时回复心跳才不会被wathdog杀死(比如Carservice),此时回复超时被杀时也会dump信息,但不是走ANR流程
根据CarServiceHelperService的逻辑,回复心跳超时会dump自身和一些native进程,这里需要注意一点Carservice被放到了nativePids被dump,是kDebuggerdNativeBacktrace而非kDebuggerdJavaBacktrace
1.ANR时Java dump(kDebuggerdJavaBacktrace)会通过signal_catcher dump信息,流程参考:
2.ANR时Native dump(kDebuggerdNativeBacktrace)会通过crash_dump dump信息,流程参考: