android 进阶篇 11、crash 监控与 anr 分析简述,vue 双向绑定原理
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 文件时注意几个点
评论