android进阶篇11、crash监控与anr分析简述,在阿里工作5年了

sb.append(Build.MANUFACTURER + “\n”);

//手机型号
sb.append("Model: ");
sb.append(Build.MODEL + “\n”);

//CPU架构
sb.append("CPU: ");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
sb.append(Arrays.toString(Build.SUPPORTED_ABIS));
} else {
sb.append(Build.CPU_ABI);
}
return sb.toString();
}
}

2、NDK Crash

1)、Linux信号机制

信号机制是Linux进程间通信的一种重要方式,Linux信号一方面用于正常的进程间通信和同步,另一方 面它还负责监控系统异常及中断。当应用程序运行异常时,Linux内核将产生错误信号并通知当前进 程。当前进程在接收到该错误信号后,可以有三种不同的处理方式。

  • 忽略该信号;
  • 捕捉该信号并执行对应的信号处理函数(信号处理程序);
  • 执行该信号的缺省操作(如终止进程);

当Linux应用程序在执行时发生严重错误,一般会导致程序崩溃。其中,Linux专门提供了一类crash信 号,在程序接收到此类信号时,缺省操作是将崩溃的现场信息记录到核心文件,然后终止进程。 常见崩溃信号:

  • SIGSEGV 内存引用无效。
  • SIGBUS 访问内存对象的未定义部分。
  • SIGFPE 算术运算错误,除以零。
  • SIGILL 非法指令,如执行垃圾或特权指令
  • SIGSYS 糟糕的系统调用
  • SIGXCPU 超过CPU时间限制。
  • SIGXFSZ 文件大小限制。

一般的出现崩溃信号,Android系统默认缺省操作是直接退出我们的程序。但是系统允许我们给某一个 进程的某一个特定信号注册一个相应的处理函数(signal),即对该信号的默认处理动作进行修改。因 此NDK Crash的监控可以采用这种信号机制,捕获崩溃信号执行我们自己的信号处理函数从而捕获NDK Crash。

2)、墓碑文件

Android本机程序本质上就是一个Linux程序,当它在执行时发生严重错误,也会导致程序崩溃,然后产 生一个记录崩溃的现场信息的文件,而这个文件在Android系统中就是 tombstones 墓碑文件。

普通应用无权限读取墓碑文件,墓碑文件位于路径/data/tombstones/下。解析墓碑文件与后面的breakPad都可使用 addr2line 工具。

3)、BreakPad

Google breakpad是一个跨平台的崩溃转储和分析框架和工具集合,其开源地址是:github.co m/google/breakpad。breakpad在Linux中的实现就是借助了Linux信号捕获机制实现的。因为其实现 为C++,因此在Android中使用,必须借助NDK工具。

二、ANR分析简介

anr全称application not responding,应用程序无响应,是通过AMS检测的,分为四种类型

  • KeyDispatchTimeout 输入事件无响应,超时时间5s
  • BroadcastTimeout 广播超时,前台广播10s,后台广播60s
  • ServiceTimeout 服务响应超时,前台服务20s,后台服务200s
  • ContentProviderTimeout 内容提供器超时,10s内没有处理完触发

上述四种类型比较特殊的是输入事件超时,其他三种类型如果到了指定的时间没有处理完一定会出发anr,但是输入事件如果到了5s没有处理完不一定触发anr,只要没有下一次输入事件等待处理就不会触发anr,我们平常接触最多的也是输入事件超时;

主要有以下三种原因导致anr

  • 在主线程中频繁的进行耗时IO操作,比如文件读写、数据库操作、操作sp等
  • 多线程下主线程被死锁
  • 系统资源被耗尽,比如cpu、io、管道等资源
    anr问题解决主要方法
    我们在开发过程中发生anr,我们可以结合logcat日志以及trace文件定位问题发生的地方,然后根据业务具体情况具体分析;我们在分析trace文件时注意几个点
  • 如果CPU的使用量很高,说明当前设备很忙,可能是CPU饥饿导致了anr
  • 如果cpu使用很低,说明主线程可能被block住了
  • 如果IOwait占比很高,那很大可能就是在主线程进行了IO耗时操作
    anr线上监控方法
  1. 通过watchdog
  2. 通过FileObserver监听data/anr文件夹的变化
    anr触发的原理,一个事件发生后,不管是广播还是服务还是输入事件,都会在system_server进程中AMS中埋下一条记录,然后去处理这个事件,如果在规定的时间内处理完毕,则把这条记录消除,如果没有处理完,就会通过引爆这条记录,触发anr。
    开发过程中我们要保持良好的习惯,UI线程不要执行耗时的操作,耗时的操作去放到子线程中处理,然后通过handler在子线程和UI线程之间通信,子线程处理完了通过Handler通知到UI线程即可;

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

img
img

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V:vip204888 备注Android获取(资料价值较高,非无偿)
img

最后看一下学习需要的所有知识点的思维导图。在刚刚那份学习笔记里包含了下面知识点所有内容!文章里已经展示了部分!如果你正愁这块不知道如何学习或者想提升学习这块知识的学习效率,那么这份学习笔记绝对是你的秘密武器!

已经展示了部分!如果你正愁这块不知道如何学习或者想提升学习这块知识的学习效率,那么这份学习笔记绝对是你的秘密武器!

[外链图片转存中…(img-18cqPDTq-1711554938417)]

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

  • 13
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值