01 | 崩溃优化(上):关于“崩溃”那些事儿
该思维导图由 AI 生成,仅供参考
Android 的两种崩溃
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了Android崩溃优化的相关技术问题,重点介绍了Native崩溃的捕获流程和难点。文章首先介绍了Android的两种崩溃类型,Java崩溃和Native崩溃,并提出了选择合适的崩溃服务的建议。随后,文章探讨了如何客观地衡量崩溃,介绍了UV崩溃率等指标的计算方法,并强调了启动崩溃对用户带来的伤害最大。通过案例引出了技术指标过于KPI化的现象,呼吁关注用户体验。最后,提出了异常率作为新的稳定性监控指标,并强调了技术人员应以用户体验为先。整体而言,本文深入浅出地介绍了崩溃优化的技术要点,对于开发人员和技术管理者具有一定的参考价值。
《Android 开发高手课》,新⼈⾸单¥59
全部留言(183)
- 最新
- 精选
- Owen置顶关于breakpad的学习,结合老师的讲解和自己的爬坑,参照老师的demo,自己写了个自己觉得理解比较通透的总结,欢迎各位大佬指导和建议https://github.com/devzhan/Breakpad2018-12-2416
- 周大军置顶首先感谢下前面同学的优质评论,我遇到一些问题实在搞不定时候,参考评论解决了一些问题。以下是我具体遇到的一些问题,希望能够给用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-069 - 永远年轻置顶虽然历经阻碍,最终没有 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-0437 - 孙鹏飞置顶关于x86模拟器下无法生成日志的问题是由于clang导致的,需要使用gcc编译,例子的readme里已经补上了解决方法2018-12-01120
- 答案文哥~我发现其实可以不用重新编译minidump_stackwalk,Android自带就有!我是windows系统,在AS安装目录下bin\lldb\bin下。我写了篇文章,亲自试过,也完成了作业!我看大家在评论区都是先编译然后再解析,而且有些学员还碰到各种问题,花了很多时间,所以希望我的经验能够帮助到其他学员,https://www.jianshu.com/p/0bfe7800bdef
作者回复: 👍
2019-01-15734 - 东方try catch 被滥用,藏的很深,吃掉了异常。曾经因为这个问题,整个团队花了两天时间才挖出来。非常愤怒。想从Java虚拟机异常机制入手,拦截所有的Java异常,然后过滤自己感兴趣的信息。但是虚拟机复杂,无从下手。 想问一下张老师有什么好的建议?
作者回复: 一般做法有 1. 在线程池直接拦截所有的java异常,但是只在正式版本使用,保留灰度包不拦截 2. 一般crash sdk都提供虽然try catch,但依然会上报到后台的方法。
2018-12-0121 - 二两五花肉老师您好,学习这里的native崩溃处理,是不是得先学习c++,战五渣表示完全看不懂这些
作者回复: 这块的确会复杂一些,还需要对指令执行机制这些都一定了解
2018-12-0310 - X你好张老师: 1.请问像微信这种大项目灰度测试一般是怎么做的? 是开发了专门的sdk么,我所知的一般是给某些渠道包作为灰度包,或者客户端根据服务器的配置来决定启用新功能,但感觉都挺麻烦的。 2.另外想问张老师个与本节无关的,就是以前做跑步App,发现进程保活很痛苦,想了解下微信的保活手段有哪些,是否真的有白名单这东西?
作者回复: 1. 有一个专门的性能收集模块,可以根据版本级别这些决定开启哪些采集模块,也可以控制采样率这些参数 2.微信保活做的很少的,主要的确是厂商的白名单
2018-12-0326 - wmjbugly里都是native的崩溃,要怎么处理?都是一些信号啥的,无从下手
作者回复: native异常分为有符号跟无符号两种,下一节我们会说到一些方法。
2018-12-036 - 二两五花肉我们项目bugly上的native crash太多了 基本都是第三方so库导致的 请问老师该怎么处理
作者回复: 如果第三方库,然后又没有symbol的话会比较麻烦。 如果本地可以复现的话,还可以用一些黑科技
2018-12-0334