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如何设定应用图标下的应用名称为汉字以及自定义图标
一.应用名称为汉字 二.自定义图标
随机推荐
- Failed to load slave replication state from table mysql.gtid_slave_pos: 1146: Table 'mysql.gtid_slave_pos' doesn't exist
http://anothermysqldba.blogspot.com/2013/06/mariadb-1003-alpha-install-on-fedora-17.html MariaDB 10. ...
- [bzoj 1025][SCOI2009]游戏(DP)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1025 分析:首先这个问题等价于A1+A2+……Ak=n,求lcm(A1,A2,……,Ak)的种 ...
- systemtap --diskio
http://blog.163.com/digoal@126/blog/static/1638770402013101993142404
- event loop js事件循环 microtask macrotask
转: 原文 http://blog.csdn.net/sjn0503/article/details/76087631 ---------------------------------------- ...
- Entity Framework性能影响因素分析
1.对象管理机制-复杂为更好的管理模型对象,EF提供了一套内部管理机制和跟踪对象的状态,保存对象一致性,使用方便,但是性能有所降低. 2.执行机制-高度封装在EF中,所有的查询表达式都会经过语法分析. ...
- Jquery Mac OS Desktop项目想启动
想用Jquery做个MAC OS Desktop应用框架,欢迎大家提建议.
- Mahout--(一)数据承载
mahout API英文解释:https://builds.apache.org/job/Mahout-Quality/javadoc/ 推荐数据的处理是大规模的,在集群环境下一次要处理的数据可能是数 ...
- B. Case of Fake Numbers( Codeforces Round #310 (Div. 2) 简单题)
B. Case of Fake Numbers time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- PX4/Pixhawk---高速成为开发人员(Windows)
1 高速成为开发人员新手教程(翻译)---官方 1.1 编译环境之版本号控制系统 (1)安装MSysGIT 安装完毕后,配置GIT. 安装注意 安装过程中除了以下一步外,其它的步骤都採用默认安 ...
- oc70--NSArray1
// // main.m // NSArray是不可变的,一旦初始化完毕,就不能添加和删除了.类似于NSString和NSMutilString. #import <Foundation/Fou ...