Breakpad/Crashpad
https://chromium.googlesource.com/breakpad/breakpad
https://chromium.googlesource.com/crashpad/crashpad
breakpad和crashpad似乎不能用于收集ANR。在它们的文档里,没有提及关于ANR的事情。
xCrash
爱奇艺2019年开源了xCrash日志收集库,可以收集Java崩溃、Native崩溃、ANR崩溃,比较全能。
对于ANR的崩溃收集,在5.0以前可以通过监听/data/anr/目录下的文件来实现,但是5.0之后文件权限收紧,不可以继续读取该文件,需要应用自己想办法收集ANR崩溃(真有你的Google)。查看Android系统和ANR相关的源码可以发现,ANR发生时系统总是会给对应的进程发送SIGSTOP信号,当进程收到SIGSTOP信号时就会认为发生了一次ANR,收集进程信息打印到/data/anr目录下。自己实现ANR日志收集时,需要重新实现一遍系统的做法。
以ANR为例看看xCrash是如何工作的。
xCrash在主线程中监听SITSTOP信号,当信号到来时,信号处理函数会使用libart中定义的_ZN3art7Runtime14DumpForSigQuitERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE函数将ART当前状态dump出来。这种方式,很显然,可能随着Android大版本的升级而失效,Google未来可能会选择不再公开该函数。但是Google既然不愿意为ART虚拟机提供稳定的API定义,目前也只能以这种hack的方式来获取虚拟机的状态。