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 ...
随机推荐
- poj 2114 树的分治 可作模板
/* 啊啊啊啊啊啊啊本题证明一个问题,在实际应用中sort比qsort块 还有memset这类初始化能不加尽量别加,很浪费时间 原来的程序把qsort该成sort,去掉一个无用memset就a了时间不 ...
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第12章节--SP 2013中远程Event Receivers
BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第12章节--SP 2013中远程Event Receivers 本章中,你讲学到: 了解远程evernt ...
- 具体解释clone函数
我们都知道linux中创建新进程是系统调用fork,但实际上fork是clone功能的一部分,clone和fork的主要差别是传递了几个參数.clone隶属于libc.它的意义就是实现线程. 看一下c ...
- 5分钟APIG实战: 使用Rust语言快速构建API能力开放
序言:Rust语言简介 参与过C/C++大型项目的同学可能都经历过因为Null Pointer.Memory Leak等问题“被” 加班了不知道多少个晚上.别沮丧,你不是一个人,Mozilla Fir ...
- Android studio一些设置项
------Appearance选项------------------------------------------------------------- Cylic scrolling in l ...
- 源代码编译安装MySQL5.6.12具体过程
1 下载安装包download tar.gzwget http://download.csdn.net/detail/mchdba/75450372 安装cmake软件包yum install cm ...
- js实现伪音乐盒
支持快进 <div class="music-part"> <div class="box-bg"></div> <d ...
- Ubuntu 16.04 安装CodeBlocks
首先将软件源添加进来,就是运行以下命令 sudo add-apt-repository ppa:damien-moore/codeblocks-stable sudo apt-get update 完 ...
- ALSA声卡驱动中的DAPM详解之六:精髓所在,牵一发而动全身
设计dapm的主要目的之一,就是希望声卡上的各种部件的电源按需分配,需要的就上电,不需要的就下电,使得整个音频系统总是处于最小的耗电状态,最主要的就是,这一切对用户空间的应用程序是透明的,也就是说,用 ...
- [NOIP2003普及组]麦森数(快速幂+高精度)
[NOIP2003普及组]麦森数(快速幂+高精度) Description 形如2^P-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2^P-1不一定也是素数.到1998 ...