android进阶篇11、crash监控与anr分析简述

本文介绍了Linux信号机制如何在NDKCrash中捕获程序崩溃,以及Android中崩溃堆栈的记录和ANR分析的原理。重点讲述了墓碑文件和BreakPad在处理Android应用异常中的作用。此外,还提到了ANR分析的类型和常见原因,以及开发过程中的性能优化策略。
摘要由CSDN通过智能技术生成

f.mkdirs();
}
File crashFile = new File(f, time + FILE_NAME_SUFFIX);
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(crashFile)));
pw.println(time);
pw.println("Thread: " + thread.getName());
pw.println(getPhoneInfo());
throwable.printStackTrace(pw); //写入crash堆栈
pw.flush();
pw.close();
return crashFile;
}

private String getPhoneInfo() throws PackageManager.NameNotFoundException {
PackageManager pm = context.getPackageManager();
PackageInfo pi = pm.getPackageInfo(context.getPackageName(), PackageManager.GET_ACTIVITIES);
StringBuilder sb = new StringBuilder();
//App版本
sb.append(“App Version: “);
sb.append(pi.versionName);
sb.append(”_”);
sb.append(pi.versionCode + “\n”);

//Android版本号
sb.append(“OS Version: “);
sb.append(Build.VERSION.RELEASE);
sb.append(”_”);
sb.append(Build.VERSION.SDK_INT + “\n”);

//手机制造商
sb.append("Vendor: ");
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住了
    自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

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

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

img

img

img

img

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

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

写在最后

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从哪里入手去学习,对此我整理了一些资料

如果你熟练掌握以下列出的知识点,相信将会大大增加你通过前两轮技术面试的几率!这些内容都供大家参考,互相学习。

①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包,最后觉得有帮助、有需要的朋友可以点个赞

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

6lwg-1712598839588)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值