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. noip模拟赛 whzzt-Warmth

    分析:这道题难度和天天爱跑步差不了多少啊......裸的暴力只有10分,最好大的还是那个5%的数据,不过这也才15分,比天天爱跑步的暴力分不知道少到哪里去了. 正解是dp,毕竟要求方案数嘛,但是这个d ...

  2. 轰炸III

    题目背景 一个大小为N*M的城市遭到了X次轰炸,每次都炸了一个每条边都与边界平行的矩形. 题目描述 在轰炸后,有Y个关键点,指挥官想知道,它们有没有受到过轰炸,如果有,被炸了几次,最后一次是第几轮. ...

  3. vijos 1237 隐形的翅膀

    隐形的翅膀 背景 小杉终于进入了天堂.他看到每个人都带着一双隐形翅膀,他也想要. (小杉是怎么看到的?……) 描述 天使告诉小杉,每只翅膀都有长度,两只翅膀的长度之比越接近黄金分割比例,就越完美. 现 ...

  4. 【Python】Python 标准库 urllib2 的使用细节

    转自:http://zhuoqiang.me/python-urllib2-usage.html http://www.cnblogs.com/txw1958/archive/2012/03/12/2 ...

  5. 去除ckeditor上传图片预览中的英文字母

    去除ckeditor上传图片预览中的英文字母 CKEDITOR.replace('text', { filebrowserImageUploadUrl : 'upload_img.do', langu ...

  6. [miniApp] WeChat user login code

    in client/app.js, we put user login logic inside here, so that other module can reuse those code by ...

  7. Android学习之利用BitmapFactory工厂压缩图片

    BufferedInputStream in = new BufferedInputStream( new FileInputStream(new File(path))); BitmapFactor ...

  8. express 不是内部或外部命令(windows)解决方式

    请环境变量设置 注意 "D:\soft\nodejs\"这个是笔者自己安装在电脑上的node js文件夹,请改动成自己的 假设安装的express是4.X就要安装 express- ...

  9. 一个unity3d lightmap问题

    上周美术同学在使用unity3d制作lightmap的过程中,发现部分被lightmap影响的模型在移动端上效果与pc端不一致.当时我大概看了下,分析后,得到一个结论是“在移动端上lightmap的h ...

  10. Java程序学习中各阶段的建议

    第一部分:对于尚未做过Java工作的同学,包括一些在校生以及刚准备转行Java的同学. 一.Java基础 首先去找一个Java的基础教程学一下,这里可以推荐一个地址,或者你也可以参照这个地址上去找相应 ...