写点什么

android 进阶篇 11、crash 监控与 anr 分析简述,vue 双向绑定原理

用户头像
Android架构
关注
发布于: 刚刚

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 内核


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


将产生错误信号并通知当前进 程。当前进程在接收到该错误信号后,可以有三种不同的处理方式。


  • 忽略该信号;

  • 捕捉该信号并执行对应的信号处理函数(信号处理程序);

  • 执行该信号的缺省操作(如终止进程);


当 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 文件时注意几个点

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
android进阶篇11、crash监控与anr分析简述,vue双向绑定原理