Android开发高手课 - 02 崩溃优化(下):应用崩溃了,你应该如何去分析?
崩溃现场
1. 崩溃信息
- 进程名、线程名
- 崩溃类型和堆栈信息
2. 系统信息
- Logcat
- 机型、系统、厂商、CPU、ABI、Linux 版本等
- 设备状态:是否 root、是否模拟器、是否有 Xposed 或多开软件造成
3. 内存信息
- 系统剩余内存
通过读取 /proc/memoinfo 获得,MemTotal 表示除了系统本身需要留下可用的总内存,MemFree 表示系统尚未使用的内存 - 应用使用内存
包括 Java 内存、RSS、PSS,RSS 和 PSS 可以通过 proc/self/smaps 获取 - 虚拟内存
4. 资源信息
- 文件句柄fd
- 线程数
线程数量超过400个就比较危险 - JNI
5. 应用信息
- 崩溃场景(哪个界面,具体业务)
- 关键操作路径
- 其它自定义信息(播放的音乐、打开的网站、运行时间、是否打了补丁等)
- 磁盘空间、电量、网络使用等
崩溃分析
第一步,确定重点
1. 确认严重程度
2. 崩溃基本信息
- Java 崩溃,查看错误栈,OOM查看日志中的“内存信息”和“资源信息”
- Native 崩溃,观察 singal、code、fault addr 等内容,以及崩溃时的 Java 堆栈
- ANR, 先查看主线程堆栈,是否因为锁等待导致,接着看 ANR 日志确定是 IO 问题、CPU 竞争问题还是大量 GC 导致卡死。
3.Logcat
当从一条崩溃日志中无法看出问题的原因,或者得不到有用信息时,不要放弃,建议查看相同崩溃点下的更多崩溃日志。
4.各个资源情况
内存与线程相关的信息都需要特别注意
第二步,查找共性
机型、系统、ROM、厂商、ABI等等,应用信息也可以作为聚合维度,如打开的链接、播放的视频、国家、地区等
第三步,尝试复现
疑难问题:系统崩溃
1. 查找可能的原因
通过共性归类、操作路径和日志等查找怀疑点
2. 尝试规避
3. Hook 解决
补充
获取 Logcat 的方法
- 通过 logcat 命令获取
- hook liblog.so 实现
- 自定义获取代码
获取 Java 堆栈
- Thread.getAllStackTraces();
- hook libart.so
课后作业
通过 hook 解决 TimeoutException
问题背景可以参考 这篇文章
- TimeoutException 是由系统的 FinalizerWatchdogDaemon 抛出来的,原因是有对象的 finalize 方法的运行时间超过了 10 秒(由 Rom 决定)
- 调用 Stop 方法在 Android 6.0 之前存在线程安全问题,是由于调用 thread.interrupt 方法没有加锁
- 最终的 hook 方案是把 FinalizerWatchdogDaemon 的 thread 设置为 null,这样 isRunning() 方法就会返回 false,而 runInternal 方法中是一个依赖 isRunning 方法的死循环,所以就 stop 掉了。
Android开发高手课 - 02 崩溃优化(下):应用崩溃了,你应该如何去分析?的更多相关文章
- Android开发高手课NOTE
最近学习了极客时间的<Android开发高手课>很有收获,记录总结一下. 欢迎学习老师的专栏:Android开发高手课 内存优化 卡顿的原因 频繁 GC 造成卡顿.物理内存不足时系统会触发 ...
- Android开发高手课笔记 - 01 崩溃优化(上):关于“崩溃”那点事
Android 的两种崩溃 Java 崩溃就是在 Java 代码中,出现了未捕获的异常,导致程序异常退出 Native 崩溃一般都是因为在 Native 代码中访问非法地址,也可能是地址对齐出了问题, ...
- Android开发学习之路--性能优化之常用工具
android性能优化相关的开发工具有很多很多种,这里对如下六个工具做个简单的使用介绍,主要有Android开发者选项,分析具体耗时的Trace view,布局复杂度工具Hierarchy Vie ...
- 【Android开发高手笔记】Dagger2和它在SystemUI上的应用
和人类需要群居一样,程序界的进程.线程也需要通信往来.它们的交流则依赖模块之间.文件之间产生的关系.如何快速地搞清和构建这种关系,同时还能减轻彼此的依赖,需要开发者们认真思考. 我们将这种需求称之为依 ...
- 学会这些你就是Android 开发高手了!
世界范围内,很多移动设备都是Android系统,Android开发可以说很有前景.对于安卓开发者来说,如果有个地方可以找到Android开发所有的资料,不需要一个网站一个网站的搜索,简直是件很开心的事 ...
- Android开发中内存和UI优化
1.内存||效率 GC这东西对于开发人员用起来比较爽,但对于技术总监或产品总监来说,他们并不在乎,在乎的是用户运行App的流畅度,待你开发完了,笑眯眯的走过来,让你测试N个适配器,烦都烦死你. 说到这 ...
- Android开发学习之路--性能优化之布局优化
Android性能优化方面也有很多文章了,这里就做一个总结,从原理到方法,工具等做一个简单的了解,从而可以慢慢地改变编码风格,从而提高性能. 一.Android系统是如何处理UI组件的更新操作的 ...
- 【android开发】如何在Linux平台下安装JDK环境
原文:http://android.eoe.cn/topic/android_sdk Linux平台JDK安装 本文主要描述如何在Linux平台下安装JDK环境.进入网页:http://www.ora ...
- Android开发app如何设定应用图标下的应用名称为汉字以及自定义图标
一.应用名称为汉字 二.自定义图标
随机推荐
- web & Rich Text Editor
web & Rich Text Editor 富文本编辑器 http://www.wangeditor.com/ https://github.com/wangfupeng1988/wangE ...
- HDU 1234 简单模拟题
题目很简单不多说了,我只是觉得这题目的输入方式还是很有特点的 #include <cstdio> #include <cstring> #include <algorit ...
- zoj 2110 很好的dfs+奇偶剪枝
//我刚开始竟然用bfs做,不断的wa,bfs是用来求最短路的而这道题是求固定时间的 //剪纸奇偶剪枝加dfs #include<stdio.h> #include<queue> ...
- java查询MySQL时,MySQL中tinyint长度为1时转换为boolean
看到别人代码,MySQL数据库中,有下面这个字段,tinyint(1) 这时候java代码中取出来的数据类型就是boolean类型,如果长度 > 1的话,就会变成int类型,特意查了一下,这里参 ...
- 解决CDH SparkStreaming任务启动之后executor不停增长的问题,num-executors配置不管用。
spark2-submit --class SparkKafka --master yarn --executor-memory 1G --num-executors 6 --driver-memor ...
- android保存bitmap到sdcard
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { //判断sdcard是否存在和是否具有读写 ...
- 武大OJ 613. Count in Sama’s triangle
Description Today, the math teacher taught Alice Hui Yang’s triangle. However, the teacher came up w ...
- [codevs 2488]绿豆蛙的归宿(拓扑排序)
题目:http://dev.codevs.cn/problem/2488/ 分析:这题有个特殊的地方,就是每个边都有可能走到,所以就是每个边的权值*每个边的概率,所以只要求概率,拓扑一下就可以了.
- POJ 1386 Play on Words(有向欧拉通路 连通图)
题意 见下方中文翻译 每一个单词能够看成首尾两个字母相连的一条边 然后就是输入m条边 推断是否能构成有向欧拉通路了 有向图存在欧拉通路的充要条件: 1. 有向图的基图连通: 2. 全部点的出度和 ...
- [Phonegap+Sencha Touch] 移动开发77 Cordova Hot Code Push插件实现自己主动更新App的Web内容
原文地址:http://blog.csdn.net/lovelyelfpop/article/details/50848524 插件地址:https://github.com/nordnet/cord ...