Android崩溃优化

154 阅读2分钟

前言

Android的两种崩溃:Java崩溃和Native崩溃(Android 平台 Native 代码的崩溃捕获机制及实现 (qq.com))。 Native崩溃捕获流程:

  • 编译端。编译C/C++代码时,需要将带符号信息的文件保留下来
  • 客户端。捕获到崩溃时,将收集到尽可能多日志写入文件,选择合适时机上报服务器
  • 服务端。读取客户端上报日志文件,寻找合适的符号文件,生成可读的C/C++调用栈。

Chromium的Breakpad是目前Native崩溃捕获中最成熟的方案。

崩溃日志生成可能遇到的问题:

  1. 文件句柄泄漏,导致创建日志失败:需要提前申请文件句柄fd预留,防止出现这种情况
  2. 栈溢出,导致日志生成失败:通常使用常见的signalstack,可能需要直接替换当前栈,需要在堆中预留部分空间
  3. 整个堆内存耗尽,日志生成失败:无法安全分配内存,不能使用stl或libc函数,它们内部实现会分配堆内存。如果继续分配堆内存,会出现堆破坏或二次崩溃的情况。Breakpad重新封装了Linux Syscall Support,避免直接调用libc。
  4. 堆破坏或二次崩溃导致日志失败:Breakpad会从原进程fork出子进程去收集崩溃场景,即使出现二次崩溃,只是部分日志丢失,父进程还可继续获取其他信息。特殊情况,可以能需要子进程fork出孙进程。

ANR问题

使用FileObserver监听/data/anr/traces.txt变化。很多高版本Android的Rom没有读取这个文件的权限了。国内微信利用Hardcoder框架(HC框架独立于Android系统实现的通信框架)。让App和厂商ROM能够实时”对话“,目标是充分调度系统资源提升App运行速度和画质,提高手机用户体验,向厂商获取更大权限。 监控消息队列运行时间,适合卡顿性能检测。