Android开发高手课笔记 - 01 崩溃优化(上):关于“崩溃”那点事
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
使用 FileObserver 监听 /data/anr/traces.txt 的变化
高版本没有这个文件读取权限了,海外可以使用 Google Play 服务,国内微信利用 HardCoder 框架监控消息队列的运行时间
缺点是无法准确判断,也无法得到完整日志
异常率
应用退出的情景
- 主动自杀
- 崩溃
- 系统重启
- 被系统杀死
- ANR
通过设置标志位,主动自杀或崩溃后更新标志位,在启动应用时检查标志位,可以统计到异常退出情况。
UV 异常率 = 发生异常退出或崩溃的 UV / 登录 UV
通过异常率我们可以比较全面的评估应用的稳定性。
课后作业
题目:使用 Breakpad 来捕获一个 Native 崩溃。
步骤如下:
- clone 项目到本地,导入 AS
- 由于早就配置过 ndk 环境,因此这一步跳过,直接可以跑起来
- 点击 APP 上的 CRASH 按钮,应用闪退,获得 crash 日志 714cda98-1316-41cc-c1da0ca0-03b243a0.dmp,在 /sdcard/crashDump/ 目录下
- 将其 pull 到本地
- 尝试使用项目中提供的 minidump_stackwalk 工具分析 dmp 文件,运行报错
- 根据提示这个 minidump_stackwalk 文件需要自己重新编译,找到breakpad的主页,按照步骤操作,编译成功
- 使用编译好的 minidump_stackwalk 工具分析 dmp 文件,运行成功,获得关键信息: Thread 0 (crashed) 0 libcrash-lib.so + 0x77e
- 找到 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 崩溃优化(上):关于“崩溃”那点事的更多相关文章
- Android开发高手课NOTE
最近学习了极客时间的<Android开发高手课>很有收获,记录总结一下. 欢迎学习老师的专栏:Android开发高手课 内存优化 卡顿的原因 频繁 GC 造成卡顿.物理内存不足时系统会触发 ...
- Android开发高手课 - 02 崩溃优化(下):应用崩溃了,你应该如何去分析?
崩溃现场 1. 崩溃信息 进程名.线程名 崩溃类型和堆栈信息 2. 系统信息 Logcat 机型.系统.厂商.CPU.ABI.Linux 版本等 设备状态:是否 root.是否模拟器.是否有 Xpos ...
- 【Android开发高手笔记】Dagger2和它在SystemUI上的应用
和人类需要群居一样,程序界的进程.线程也需要通信往来.它们的交流则依赖模块之间.文件之间产生的关系.如何快速地搞清和构建这种关系,同时还能减轻彼此的依赖,需要开发者们认真思考. 我们将这种需求称之为依 ...
- 阿里内部资料:Android开发核心知识笔记共2100页,58万字,完整版开放下载
作为一个3-5年的Android工程师,我们经常会遇到这些瓶颈: 1.技术视野窄长期在小型软件公司,外包公司工作,技术视野被限制的太厉害 2.薪资提升难初中级Android岗位薪资上升空间有限,基本上 ...
- Android开发艺术探索笔记——View(二)
Android开发艺术探索笔记--View(二) View的事件分发机制 学习资料: 1.Understanding Android Input Touch Events System Framewo ...
- Android开发艺术探索笔记—— View(一)
Android开发艺术探索笔记 --View(一) View的基础知识 什么是View View是Android中所有控件的基类.是一种界面层控件的抽象. View的位置参数 参数名 获取方式 含义 ...
- Android开发艺术探索笔记——第一章:Activity的生命周期和启动模式
Android开发艺术探索笔记--第一章:Activity的生命周期和启动模式 怀着无比崇敬的心情翻开了这本书,路漫漫其修远兮,程序人生,为自己加油! 一.序 作为这本书的第一章,主席还是把Activ ...
- 「Android 开发」入门笔记
「Android 开发」入门笔记(界面编程篇) ------每日摘要------ DAY-1: 学习笔记: Android应用结构分析 界面编程与视图(View)组件 布局管理器 问题整理: Andr ...
- Ubuntu虚拟机+ROS+Android开发环境配置笔记
Ubuntu虚拟机+ROS+Android开发环境配置笔记 虚拟机设置: 1.本地环境:Windows 7:VMWare:联网 2.虚拟环境 :Ubuntu 14.04. 比較稳定,且支持非常多ROS ...
随机推荐
- Mysql 使用delete drop truncate 删除数据时受外键约束影响解决方案
先禁用数据库的外键约束: set foreign_key_checks=0; 进行删除操作 delete.drop.truncate 恢复数据库外键约束: set foreign_key_checks ...
- SAP Portal 上传资源到WRR
Uploading Resources to the Web Resource Repository Prerequisites You have been assigned the Content ...
- srvctl error
Hit an strange error just now. [oracle@racnode1 ~]$ srvctl # # An unexpected error has been detected ...
- logout退出功能是怎么实现的?login登陆功能室怎么实现的
logout退出功能是怎么实现的?login登陆功能室怎么实现的 login就是登陆成功的时候,在session里面创建好用户对应的数据. logout就是登出的时候,在session里面销毁用户对应 ...
- MongoDB:最简单的增删改查(Oops,可能太简单了)
热身运动: 1. 启动MongoDB shell => mongo.exe or ./mongo(先确保有一个mongod的实例): 2. 切换到一个用于练手的namespace => u ...
- gem5: 使用ruby memory system中的mesh结构 出现AssertionError错误
问题:在使用ruby memory system中的mesh结构測试时,出现例如以下错误: Traceback (most recent call last): File "<stri ...
- Android开发之ListView实现不同品种分类分隔栏的效果(非ExpandableListView实现)
我们有时候会遇到这么一个情况.就是我在一个ListView里面须要显示的东西事实上是有种类之分的.比方我要分冬天,夏天.秋天.春天,然后在这每一个季节以下再去载入各自的条目数据. 还有,比方我们的通讯 ...
- vijos - P1302连续自然数和 (公式推导 + python)
P1302连续自然数和 Accepted 标签:[显示标签] 描写叙述 对一个给定的自然数M,求出所有的连续的自然数段(连续个数大于1).这些连续的自然数段中的所有数之和为M. 样例:1998+199 ...
- CoffeeScript里的字符串插值
拼接字符串是我们常干的事情.与其用很多的 "" + "",不如用一下字符串插值,可读性好些. 方法是在字符串中加入#{ 变量.表达式.函数等} getOther ...
- 转 美制电线标准AWG与公制、英制单位对照
在以太网和xDSL接入网设计中,经常会碰到诸如24AWG.26AWG等等表示电缆直径的方法.其实AWG(American Wire Gauge)是美制电线标准的简称,AWG值是导线厚度(以英寸计)的函 ...