Native 崩溃和 ANR 的采集采用基于 Native 信号量的方案。Android 应用可以包含 C/C++ 代码(Native 代码),当这些代码出现访问无效内存地址、执行非法指令等严重错误时,操作系统会向进程发送 POSIX 信号(如 SIGSEGV 代表段错误、SIGILL 代表非法指令),默认行为是立即终止应用即闪退。同时,Android 的所有 UI 操作和大部分应用层回调必须在主线程执行,若主线程被耗时操作阻塞,无法在规定时间内(输入事件 5 秒、广播 10 秒)响应,系统就会判定应用无响应即 ANR。
技术原理是:在应用初始化时注册一个自定义的信号处理器来接管系统默认处理器。当捕获到崩溃信号或在系统判定 ANR 的精确时刻,它不会立即退出,而是先生成一个包含详细崩溃信息(线程堆栈、寄存器状态、加载的库等)的崩溃信息文件,然后再执行默认的崩溃流程。
具体采集能力:
- Native 崩溃采集:通过监听 Native 信号量,在 APP 崩溃时采集 Native 堆栈、CPU、寄存器等生成快照文件,在应用下次启动时扫描并解析崩溃信息并上报。
- ANR 采集:利用系统发送 SIGQUIT 信号这一机制,通过在 Native 层使用 sigaction 函数监听此信号,在系统判定 ANR 的精确时刻获得通知,从而触发信息收集流程。




