Android 开发高手课
张绍文
前微信高级工程师,Tinker 负责人
52721 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 62 讲
导读 (1讲)
模块一 高质量开发 (25讲)
Android 开发高手课
15
15
1.0x
00:00/00:00
登录|注册

01 | 崩溃优化(上):关于“崩溃”那些事儿

异常率
ANR异常
重复崩溃率
启动崩溃率
PV崩溃率
UV崩溃率
堆破坏或二次崩溃
内存耗尽
栈溢出
文件句柄泄漏
服务端
客户端
编译端
Native崩溃
Java崩溃
课后作业
总结
如何客观地衡量稳定性
如何客观地衡量崩溃
选择合适的崩溃服务
Native崩溃捕获的难点
Native崩溃的捕获流程
Android 的两种崩溃
崩溃优化(上):关于“崩溃”那些事儿
参考文章

该思维导图由 AI 生成,仅供参考

在各种场合遇到其他产品的开发人员时,大家总忍不住想在技术上切磋两招。第一句问的通常都是“你们产品的崩溃率是多少?”
程序员 A 自豪地说: “百分之一。”
旁边的程序员 B 鄙视地看了一眼,然后喊到: “千分之一!”
“万分之一” ,程序员 C 说完之后全场变得安静起来。
崩溃率是衡量一个应用质量高低的基本指标,这一点是你我都比较认可的。不过你说的“万分之一”就一定要比我说的“百分之一” 更好吗?我觉得,这个问题其实并不仅仅是比较两个数值这么简单。
今天我们就来聊一聊有关“崩溃”的那些事,我会从 Android 的两种崩溃类型谈起,再和你进一步讨论到底该怎样客观地衡量崩溃这个指标,以及又该如何看待和崩溃相关的稳定性。

Android 的两种崩溃

我们都知道,Android 崩溃分为 Java 崩溃和 Native 崩溃。
简单来说,Java 崩溃就是在 Java 代码中,出现了未捕获异常,导致程序异常退出那 Native 崩溃又是怎么产生的呢?一般都是因为在 Native 代码中访问非法地址,也可能是地址对齐出现了问题,或者发生了程序主动 abort,这些都会产生相应的 signal 信号,导致程序异常退出
所以,“崩溃”就是程序出现异常,而一个产品的崩溃率,跟我们如何捕获、处理这些异常有比较大的关系。Java 崩溃的捕获比较简单,但是很多同学对于如何捕获 Native 崩溃还是一知半解,下面我就重点介绍 Native 崩溃的捕获流程和难点。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了Android崩溃优化的相关技术问题,重点介绍了Native崩溃的捕获流程和难点。文章首先介绍了Android的两种崩溃类型,Java崩溃和Native崩溃,并提出了选择合适的崩溃服务的建议。随后,文章探讨了如何客观地衡量崩溃,介绍了UV崩溃率等指标的计算方法,并强调了启动崩溃对用户带来的伤害最大。通过案例引出了技术指标过于KPI化的现象,呼吁关注用户体验。最后,提出了异常率作为新的稳定性监控指标,并强调了技术人员应以用户体验为先。整体而言,本文深入浅出地介绍了崩溃优化的技术要点,对于开发人员和技术管理者具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Android 开发高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(183)

  • 最新
  • 精选
  • Owen
    置顶
    关于breakpad的学习,结合老师的讲解和自己的爬坑,参照老师的demo,自己写了个自己觉得理解比较通透的总结,欢迎各位大佬指导和建议https://github.com/devzhan/Breakpad
    2018-12-24
    16
  • 周大军
    置顶
    首先感谢下前面同学的优质评论,我遇到一些问题实在搞不定时候,参考评论解决了一些问题。以下是我具体遇到的一些问题,希望能够给用Ubuntu作为开发环境的同学一点帮助。 PC操作系统:Ubuntu18.04 X64 AS版本:3.1 手机:华为V8 8.0系统 遇到的问题: 1. 导入项目编译不过: Build command failed. Error while executing process /home/jayden/Android/Sdk/cmake/3.6.4111459/bin/cmake with arguments {-H/mnt/D..... CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage -- Configuring incomplete, errors occurred! 解决方法: 下载cmake 3.6对应的ndk版本,下载ndk12版本( https://dl.google.com/android/repository/android-ndk-r12b-linux-x86_64.zip)解压到sdk路径下,并在local.properties配置上对应的ndk.dir路径。 2. minidump_stackwalk dump对应的 crash文件时候,报错,如上老师说的,需要自己编译对应环境的源码,所以我选择下载https://github.com/google/breakpad里的depot_tools,然后make install出来自己用。也可以借鉴其他人下载缺失的头文件来编译github上的源码。 3. addr2line的时候,报错 File format not recognized, Linux的话需要用aarch64-linux-android-4.9,而不是arm-linux-androideabi-4.9 。 ~/Android/Sdk/android-ndk-r12b/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-addr2line -f -C -e sample/build/intermediates/transforms/mergeJniLibs/debug/0/lib/arm64-v8a/libcrash-lib.so 0x5a0 Crash() /mnt/Data/github/Geek_Android_Improve/Chapter01/sample/src/main/cpp/crash.cpp:10

    作者回复: 赞

    2018-12-06
    9
  • 永远年轻
    置顶
    虽然历经阻碍,最终没有 dump 成功,但可以给还没操作的同学一点建议 1.最好自备梯子,导入工程会很顺利 2.Smaple 里「补充内容」那几行代码是加到 build.gradle -> andoroid -> defaultConfig 里的 3.装在 ARM 设备上时提示找不到 "libbreakpad-core.so" , build 一个 apk 就好了 4.macOS 10.14 删除了 libstdc++.6.dylib 和 libstdc++.dylib 两个动态库,/usr/lib 里的同名文件都是 libstdc++.6.0.9.dylib 的替身,用 minidump_stackwalk 时会提示 「__ZTTNSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEEE」这个方法找不到,通过 google 搜索都是 Xcode 开发相关的解决方案 ps 试着下 depot_tools 自己编译,要下载好几个 G 的数据,放弃了。

    作者回复: 这个赞一下。有一个问题就是我们虽然可以提供breakpad tools 编译好的bin放上去,但由于运行环境不同会导致上述缺少动态链接库的问题,所以建议同学自己编译。网上的文章多是提出depottools的编译方案,其实可以使用breakpad的源码直接使用cmake编译。这个在breakpad官方库的doc里有说明

    2018-12-04
    3
    7
  • 孙鹏飞
    置顶
    关于x86模拟器下无法生成日志的问题是由于clang导致的,需要使用gcc编译,例子的readme里已经补上了解决方法
    2018-12-01
    1
    20
  • 答案
    文哥~我发现其实可以不用重新编译minidump_stackwalk,Android自带就有!我是windows系统,在AS安装目录下bin\lldb\bin下。我写了篇文章,亲自试过,也完成了作业!我看大家在评论区都是先编译然后再解析,而且有些学员还碰到各种问题,花了很多时间,所以希望我的经验能够帮助到其他学员,https://www.jianshu.com/p/0bfe7800bdef

    作者回复: 👍

    2019-01-15
    7
    34
  • 东方
    try catch 被滥用,藏的很深,吃掉了异常。曾经因为这个问题,整个团队花了两天时间才挖出来。非常愤怒。想从Java虚拟机异常机制入手,拦截所有的Java异常,然后过滤自己感兴趣的信息。但是虚拟机复杂,无从下手。 想问一下张老师有什么好的建议?

    作者回复: 一般做法有 1. 在线程池直接拦截所有的java异常,但是只在正式版本使用,保留灰度包不拦截 2. 一般crash sdk都提供虽然try catch,但依然会上报到后台的方法。

    2018-12-01
    21
  • 二两五花肉
    老师您好,学习这里的native崩溃处理,是不是得先学习c++,战五渣表示完全看不懂这些

    作者回复: 这块的确会复杂一些,还需要对指令执行机制这些都一定了解

    2018-12-03
    10
  • X
    你好张老师: 1.请问像微信这种大项目灰度测试一般是怎么做的? 是开发了专门的sdk么,我所知的一般是给某些渠道包作为灰度包,或者客户端根据服务器的配置来决定启用新功能,但感觉都挺麻烦的。 2.另外想问张老师个与本节无关的,就是以前做跑步App,发现进程保活很痛苦,想了解下微信的保活手段有哪些,是否真的有白名单这东西?

    作者回复: 1. 有一个专门的性能收集模块,可以根据版本级别这些决定开启哪些采集模块,也可以控制采样率这些参数 2.微信保活做的很少的,主要的确是厂商的白名单

    2018-12-03
    2
    6
  • wmj
    bugly里都是native的崩溃,要怎么处理?都是一些信号啥的,无从下手

    作者回复: native异常分为有符号跟无符号两种,下一节我们会说到一些方法。

    2018-12-03
    6
  • 二两五花肉
    我们项目bugly上的native crash太多了 基本都是第三方so库导致的 请问老师该怎么处理

    作者回复: 如果第三方库,然后又没有symbol的话会比较麻烦。 如果本地可以复现的话,还可以用一些黑科技

    2018-12-03
    3
    4
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部