崩溃现场

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 的方法

  1. 通过 logcat 命令获取
  2. hook liblog.so 实现
  3. 自定义获取代码

获取 Java 堆栈

  1. Thread.getAllStackTraces();
  2. hook libart.so

课后作业

通过 hook 解决 TimeoutException

问题背景可以参考 这篇文章

  1. TimeoutException 是由系统的 FinalizerWatchdogDaemon 抛出来的,原因是有对象的 finalize 方法的运行时间超过了 10 秒(由 Rom 决定)
  2. 调用 Stop 方法在 Android 6.0 之前存在线程安全问题,是由于调用 thread.interrupt 方法没有加锁
  3. 最终的 hook 方案是把 FinalizerWatchdogDaemon 的 thread 设置为 null,这样 isRunning() 方法就会返回 false,而 runInternal 方法中是一个依赖 isRunning 方法的死循环,所以就 stop 掉了。

Android开发高手课 - 02 崩溃优化(下):应用崩溃了,你应该如何去分析?的更多相关文章

  1. Android开发高手课NOTE

    最近学习了极客时间的<Android开发高手课>很有收获,记录总结一下. 欢迎学习老师的专栏:Android开发高手课 内存优化 卡顿的原因 频繁 GC 造成卡顿.物理内存不足时系统会触发 ...

  2. Android开发高手课笔记 - 01 崩溃优化(上):关于“崩溃”那点事

    Android 的两种崩溃 Java 崩溃就是在 Java 代码中,出现了未捕获的异常,导致程序异常退出 Native 崩溃一般都是因为在 Native 代码中访问非法地址,也可能是地址对齐出了问题, ...

  3. Android开发学习之路--性能优化之常用工具

      android性能优化相关的开发工具有很多很多种,这里对如下六个工具做个简单的使用介绍,主要有Android开发者选项,分析具体耗时的Trace view,布局复杂度工具Hierarchy Vie ...

  4. 【Android开发高手笔记】Dagger2和它在SystemUI上的应用

    和人类需要群居一样,程序界的进程.线程也需要通信往来.它们的交流则依赖模块之间.文件之间产生的关系.如何快速地搞清和构建这种关系,同时还能减轻彼此的依赖,需要开发者们认真思考. 我们将这种需求称之为依 ...

  5. 学会这些你就是Android 开发高手了!

    世界范围内,很多移动设备都是Android系统,Android开发可以说很有前景.对于安卓开发者来说,如果有个地方可以找到Android开发所有的资料,不需要一个网站一个网站的搜索,简直是件很开心的事 ...

  6. Android开发中内存和UI优化

    1.内存||效率 GC这东西对于开发人员用起来比较爽,但对于技术总监或产品总监来说,他们并不在乎,在乎的是用户运行App的流畅度,待你开发完了,笑眯眯的走过来,让你测试N个适配器,烦都烦死你. 说到这 ...

  7. Android开发学习之路--性能优化之布局优化

      Android性能优化方面也有很多文章了,这里就做一个总结,从原理到方法,工具等做一个简单的了解,从而可以慢慢地改变编码风格,从而提高性能. 一.Android系统是如何处理UI组件的更新操作的 ...

  8. 【android开发】如何在Linux平台下安装JDK环境

    原文:http://android.eoe.cn/topic/android_sdk Linux平台JDK安装 本文主要描述如何在Linux平台下安装JDK环境.进入网页:http://www.ora ...

  9. Android开发app如何设定应用图标下的应用名称为汉字以及自定义图标

    一.应用名称为汉字 二.自定义图标

随机推荐

  1. 【Chrome】Chrome浏览器怎么查看版本信息

    第一步,打开Chrome浏览器 第二步,弹出浏览器主界面 第三步,点击右上按钮(三横杠) 第四步,下拉中选择“关于” 第五步,弹出窗口,可以看到版本信息 第二种方法: 第六步,也可以通过地址栏里输入命 ...

  2. A - 不容易系列之(3)―― LELE的RPG难题 简单递推

    人称“AC女之杀手”的超级偶像LELE最近忽然玩起了深沉,这可急坏了众多“Cole”(LELE的粉丝,即"可乐"),经过多方打探,某资深Cole终于知道了原因,原来,LELE最近研 ...

  3. Ubuntu 16.04安装设备管理器Hardinfo和lshw设备信息命令

    安装: sudo apt-get install hardinfo 启动: 实际上这些信息都可以通过lshw进行查看,参考:https://linux.die.net/man/1/lshw

  4. Java Number类(数据类型的包装类)

    Java Number 一般地,当需要使用数字的时候,我们通常使用内置数据类型,如:byte.int.long.double等. 例如: int i = 5000; float gpa = 13.65 ...

  5. php 生成订单号

    最近在练手一个订单提交的小项目,需要用到生成订单号,网上找了下,觉得这个最好. function build_order_no(){ return date('Ymd').substr(implode ...

  6. iOS8開始默认语言有变化

    [问题] 測试组发现APP在iOS8及以上系统设备上,语言设置为我们不支持的小语种时.APP没有使用默认的英文,而是选择了上一次设置的语言. [分析] 经过研究发现,在iOS8系统開始,在设备语言设置 ...

  7. linux下使用script和scriptreplay对命令行操作进行录像

    转自:linux下用script和scriptreplay对命令行操作录像 在Linux中可以使用script命令来记录命令行的操作过程,并使用scriptreplay命令对命令操作进行回放,操作步骤 ...

  8. HDOJ 题目5289 Assignment(RMQ,技巧)

    Assignment Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...

  9. linux 网络编程-基础篇01

    #Socket简介 是一个编程接口是一种特殊的文件描述符(everything in Unix is a file)并不仅限于TCPIP协议面向连接(Transmission Control Prot ...

  10. poj2104 k-th number 主席树入门讲解

    poj2104 k-th number 主席树入门讲解 定义:主席树是一种可持久化的线段树 又叫函数式线段树   刚开始学是不是觉得很蒙逼啊 其实我也是 主席树说简单了 就是 保留你每一步操作完成之后 ...