崩溃现场

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. Android layer-list(3)

     Android layer-list(3) 在附录文章3.4的基础上,就Android layer-list再写一个较为复杂的应用. 先写布局文件,该布局涉及到LinearLayoutCompa ...

  2. Codeforces Round #219 (Div. 2) D题

    D. Counting Rectangles is Fun time limit per test 4 seconds memory limit per test 256 megabytes inpu ...

  3. 最小生成树+BFS J - Borg Maze

    The Borg is an immensely powerful race of enhanced humanoids from the delta quadrant of the galaxy. ...

  4. 14、Java并发性和多线程-Java ThreadLocal

    以下内容转自http://ifeve.com/java-theadlocal/: Java中的ThreadLocal类可以让你创建的变量只被同一个线程进行读和写操作.因此,尽管有两个线程同时执行一段相 ...

  5. 安全简单解决MVC 提示 检测到有潜在危险的 Request.Form 值.

    一般使用富文本编辑器的时候.提交的表单中包含HTML字符,就会出现此错误提示. 使用 ValidateInput(false) 特性标签并不能解决此问题. 网上前篇一律的回答是修改Web.Config ...

  6. 【CV知识学习】Fisher Vector

    在论文<action recognition with improved trajectories>中看到fisher vector,所以学习一下.但网上很多的资料我觉得都写的不好,查了一 ...

  7. redis 主从备份自动切换+java代码实现类

    转载:http://blog.csdn.net/qq_23430789/article/details/52185706 目录(?)[-] redis-0sentinel实例之间的通讯端口 maste ...

  8. Workspace in use or cannot be created, choose a different one.--错误解决的方法

    eclipse 使用一段时间后.有时会由于一些故障自己就莫名奇异的关闭了,再打开时有时没有问题,有时有会提示错误 Workspace Unavailable: Workspace in use or ...

  9. 细数MQ那些不得不说的8大好处

    消息队列(MQ)是目前系统架构中主流方式,在大型系统及大数据中广泛采用.对任何架构或应用来说, MQ都是一个至关重要的组件.今天我们就来细数MQ那些不得不说的好处. 好处一:解耦 在项目启动之初来预测 ...

  10. C++ 函数模板与类模板(使用 Qt 开发编译环境)

    注意:本文中代码均使用 Qt 开发编译环境,如有疑问和建议欢迎随时留言. 模板是 C++ 支持参数化程序设计的工具,通过它可以实现参数多态性.所谓参数多态性,就是将程序所处理的对象的类型参数化,使得一 ...