Android 的两种崩溃

  • Java 崩溃就是在 Java 代码中,出现了未捕获的异常,导致程序异常退出
  • Native 崩溃一般都是因为在 Native 代码中访问非法地址,也可能是地址对齐出了问题,或者发生了程序主动 abort,这些都会产生响应的 singal 信号,导致程序异常退出

1.Native 崩溃的捕获流程

参考资料: Android 平台 Native 代码的崩溃捕获机制及实现

  • 编译端编译时保留带符号信息的文件;
  • 客户端将崩溃日志和尽可能多的有用信息写入日志文件,并上传到服务器;
  • 服务端读取日志文件,找到适合的符号文件,生成可读的 C 调用栈。

2.Native 崩溃捕获的难点

最核心的是怎么样保证客户端在各种极端情况下一日可以生成崩溃日志。

Chromium 的 Breakpad 是目前 Native 崩溃捕获中最成熟的方案。

3.选择合适的崩溃服务

  • 腾讯 Bugly
  • 阿里 啄木鸟平台
  • 网易云捕
  • Google Firebase

如何客观地衡量崩溃

如果想评估崩溃造成的用户影响范围,先去看 UV 崩溃率。

UV 崩溃率 = 发生崩溃的 UV / 登录的 UV

常用指标还有 PV 崩溃率、启动崩溃率、重复崩溃率。

启动崩溃对用户伤害最大,应用无法启动往往通过热修复也无法拯救。

重运营的应用汇使用”安全模式“来保证客户端的启动流程。

参考资料:

PV 即 Page View,网站浏览量,指页面的浏览次数,用以衡量网站用户访问的网页数量。用户没打开一个页面便记录1次PV,多次打开同一页面则浏览量累计;

UV 即Unique Vistor,独立访客数,指1天内访问某站点的人数,以cookie为依据。1天内同一访客的多次访问只计为1个访客;

淘宝团队是如何进行稳定性测试的

安全模式:天猫App启动保护实践

如何客观地衡量稳定性

如何发现应用中的ANR

  1. 使用 FileObserver 监听 /data/anr/traces.txt 的变化

    高版本没有这个文件读取权限了,海外可以使用 Google Play 服务,国内微信利用 HardCoder 框架

  2. 监控消息队列的运行时间

    缺点是无法准确判断,也无法得到完整日志

异常率

应用退出的情景

  • 主动自杀
  • 崩溃
  • 系统重启
  • 被系统杀死
  • ANR

通过设置标志位,主动自杀或崩溃后更新标志位,在启动应用时检查标志位,可以统计到异常退出情况。

UV 异常率 = 发生异常退出或崩溃的 UV / 登录 UV

通过异常率我们可以比较全面的评估应用的稳定性。

课后作业

题目:使用 Breakpad 来捕获一个 Native 崩溃。

步骤如下:

  1. clone 项目到本地,导入 AS
  2. 由于早就配置过 ndk 环境,因此这一步跳过,直接可以跑起来
  3. 点击 APP 上的 CRASH 按钮,应用闪退,获得 crash 日志 714cda98-1316-41cc-c1da0ca0-03b243a0.dmp,在 /sdcard/crashDump/ 目录下
  4. 将其 pull 到本地
  5. 尝试使用项目中提供的 minidump_stackwalk 工具分析 dmp 文件,运行报错
  6. 根据提示这个 minidump_stackwalk 文件需要自己重新编译,找到breakpad的主页,按照步骤操作,编译成功
  7. 使用编译好的 minidump_stackwalk 工具分析 dmp 文件,运行成功,获得关键信息: Thread 0 (crashed) 0 libcrash-lib.so + 0x77e
  8. 找到 libcrash-lib.so 拷到当前目录,运行 arm-linux-androideabi-addr2line 命令,定位到报错方法
➜  chapter01 /Users/daniel/Library/Android/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-addr2line -f -C -e libcrash-lib.so 0x77e
Crash()
/Users/daniel/Workspace/Chapter01/sample/src/main/cpp/crash.cpp:10

Android开发高手课笔记 - 01 崩溃优化(上):关于“崩溃”那点事的更多相关文章

  1. Android开发高手课NOTE

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

  2. Android开发高手课 - 02 崩溃优化(下):应用崩溃了,你应该如何去分析?

    崩溃现场 1. 崩溃信息 进程名.线程名 崩溃类型和堆栈信息 2. 系统信息 Logcat 机型.系统.厂商.CPU.ABI.Linux 版本等 设备状态:是否 root.是否模拟器.是否有 Xpos ...

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

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

  4. 阿里内部资料:Android开发核心知识笔记共2100页,58万字,完整版开放下载

    作为一个3-5年的Android工程师,我们经常会遇到这些瓶颈: 1.技术视野窄长期在小型软件公司,外包公司工作,技术视野被限制的太厉害 2.薪资提升难初中级Android岗位薪资上升空间有限,基本上 ...

  5. Android开发艺术探索笔记——View(二)

    Android开发艺术探索笔记--View(二) View的事件分发机制 学习资料: 1.Understanding Android Input Touch Events System Framewo ...

  6. Android开发艺术探索笔记—— View(一)

    Android开发艺术探索笔记 --View(一) View的基础知识 什么是View View是Android中所有控件的基类.是一种界面层控件的抽象. View的位置参数 参数名 获取方式 含义 ...

  7. Android开发艺术探索笔记——第一章:Activity的生命周期和启动模式

    Android开发艺术探索笔记--第一章:Activity的生命周期和启动模式 怀着无比崇敬的心情翻开了这本书,路漫漫其修远兮,程序人生,为自己加油! 一.序 作为这本书的第一章,主席还是把Activ ...

  8. 「Android 开发」入门笔记

    「Android 开发」入门笔记(界面编程篇) ------每日摘要------ DAY-1: 学习笔记: Android应用结构分析 界面编程与视图(View)组件 布局管理器 问题整理: Andr ...

  9. Ubuntu虚拟机+ROS+Android开发环境配置笔记

    Ubuntu虚拟机+ROS+Android开发环境配置笔记 虚拟机设置: 1.本地环境:Windows 7:VMWare:联网 2.虚拟环境 :Ubuntu 14.04. 比較稳定,且支持非常多ROS ...

随机推荐

  1. 1154 能量项链 2006年NOIP全国联赛提高组 codevs

    1154 能量项链  2006年NOIP全国联赛提高组 codevs 题目描述 Description 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头 ...

  2. - > 动规讲解基础讲解四——矩阵取数

    给定一个m行n列的矩阵,矩阵每个元素是一个正整数,你现在在左上角(第一行第一列),你需要走到右下角(第m行,第n列),每次只能朝右或者下走到相邻的位置,不能走出矩阵.走过的数的总和作为你的得分,求最大 ...

  3. MS SQL SERVER 书BOOK

    http://www.cnblogs.com/lyhabc/p/4833248.html

  4. mysql bin-log 设置

    mysql 的事物日至为 [root@localhost mysql]# ls -ldtr mysql-bin.* -rw-rw---- mysql mysql 4月 : mysql-bin. -rw ...

  5. Oracle Multitenant Environment (四) Create One or More CDBs

    Using the CREATE DATABASE Statement to Create a CDB This section describes creating a CDB using the  ...

  6. 基于Linux下的UDP编程

    一. Linux下UDP编程框架 使用UDP进行程序设计可以分为客户端和服务器端两部分. 1.服务器端程序包括: Ø  建立套接字 Ø  将套接字地址结构进行绑定 Ø  读写数据 Ø  关闭套接字 2 ...

  7. es6 Object.assign ECMAScript 6 笔记(六) ECMAScript 6 笔记(一) react入门——慕课网笔记 jquery中动态新增的元素节点无法触发事件解决办法 响应式图像 弹窗细节 微信浏览器——返回操作 Float 的那些事 Flex布局 HTML5 data-* 自定义属性 参数传递的四种形式

    es6 Object.assign   目录 一.基本用法 二.用途 1. 为对象添加属性 2. 为对象添加方法 3. 克隆对象 4. 合并多个对象 5. 为属性指定默认值 三.浏览器支持 ES6 O ...

  8. 【UML 建模】在线UML建模工具 ProcessOn 使用具体解释

    总结 : -- 推荐理由 : 近期从 Windows 操作系统 转到 MAC 上, 正在看设计模式 和 重构, 找不到好用的 UML 工具, 因此在网上找了一款能够在线使用的 UML 工具, 用起来发 ...

  9. ACdream区域赛指导赛之手速赛系列(7)

    A -Dragon Maze Time Limit: 2000/1000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) Submi ...

  10. Unix/Linux环境C编程新手教程(40) 初识文件操作

     1.函数介绍 close(关闭文件) 相关函数 open,fcntl,shutdown.unlink,fclose 表头文件 #include<unistd.h> 定义函数 int ...