不断学习,做更好的自己!
视频号 | CSDN | 简书 |
---|---|---|
欢迎打开微信,关注我的视频号:程序员朵朵 | 点我 | 点我 |
1. 稳定性纬度
2. 稳定性优化概述
3. Crash相关指标
UV、PV
PV(Page View):访问量
UV(Unique Visitor):独立访客,0 - 24小时内的同一终端只计算一次
UV、PV、启动Crash率
UV Crash率:针对用户使用量的统计,统计一段时间内所有用户发生崩溃的占比
Crash UV / DAU:评估Crash率的影响范围,结合PV
注意:沿用同一指标
PV Crash率:评估相关Crash影响的严重程度
启动Crash率:影响最严重的Crash,对用户伤害最大,无法通过热修复拯救,需结合客户端容灾
增量、存量Crash率:增量Crash是新版本重点,存量Crash是需要持续啃的硬骨头,优先解决增量、持续跟进存量
4. Crash率评价
5. Crash关键问题
尽可能还原Crash现场:
6. APM Crash部分整体架构
采集层
处理层
展示层
报警层
责任归属
1. 单个Crash处理方案
根据堆栈及现场信息找答案
解决90%问题
解决完后需考虑产生Crash深层次的原因
找共性:机型、OS、实验开关、资源包,考虑影响范围
线下复现、远程调试
2. Crash率治理方案
解决线上常规Crash
系统级Crash尝试Hook绕过
疑难Crash重点突破或更换方案
3. Java Crash
出现未捕获异常,导致出现异常退出。
Thread.setDefaultUncaughtExceptionHandler();
我们通过设置自定义的 UncaughtExceptionHandler
,就可以在崩溃发生的时候获取到现场信息。注意,这个钩子是针对单个进程而言的,在多进程的APP中,监控哪个进程,就需要在哪个进程中设置一遍ExceptionHandler。
获取主线程的堆栈信息:
Looper.getMainLooper().getThread().getStackTrace();
获取当前线程的堆栈信息:
Thread.currentThread().getStackTrace();
获取全部线程的堆栈信息:
Thread.getAllStackTraces();
第三方 Crash 监控工具如 Fabric
、腾讯Bugly
,都是以字符串拼接的方式将数组 StackTraceElement[]
转换成字符串形式,进行保存、上报或者展示。
4. Native Crash
特点:
上述都会产生相应的signal信号,导致程序异常退出。
Google Breakpad
优点:权威、跨平台
缺点:代码体量较大
Logcat
优点:利用安卓系统实现
缺点:需要在crash时启动新进程过滤logcat日志,不可靠
coffeecatch
优点:实现简洁、改动容易
缺点:有兼容性问题
1. ANR 发生原因
没有在规定的时间内完成要完成的事情。
2. 发生场景
Activity onCreate
方法或 Input 事件超过 5s 没有完成BroadcastReceiver
前台 10s,后台 60sContentProvider
在publish过超时 10s;Service
前台 20s,后台 200s3. 发生原因
IO
操作block
Binder
对端block
Binder
被占满导致主线程无法和SystemServer
通信CPU/RAM/IO
)业务高可用重要性
业务高可用方案建设
数据采集
梳理项目主流程、核心路径、关键节点
Aop
自动采集、统一上报
报警策略:阈值报警、趋势报警、特定指标报警、直接上报(或底阈值)
异常监控
单点追查:需要针对性分析的特定问题,全量日志回捞,专项分析
兜底策略
配置中心、功能开关
跳转分发中心(组件化路由)
移动端容灾方案
灾包括:
传统流程:
用户反馈、重新打包、渠道更新、不可接受。
容灾方案建设:
功能开关
配置中心,服务端下发配置控制
针对场景:
统跳中心
Native Bug
不能热修复则跳转到临时H5
页面动态化修复
推拉结合、多场景调用保证到达率
Weex、RN增量更新
安全模式
微信读书、蘑菇街、淘宝、天猫等“重运营”的APP
都使用了安全模式保障客户端启动流程,启动失败后给用户自救机会。先介绍一下它的核心特点:
Crash
信息自动恢复,多次启动失败重置应用为安装初始状态Bug
可阻塞性热修复安全模式设计
配置后台:统一的配置后台,具备灰度发布机制
1、客户端能力:
APP
连续Crash
的情况下具备分级、无感自修复能力2、数据统计及告警
3、快速测试
天猫安全模式原理
1、如何判断异常退出?
APP
启动时记录一个flag
值,满足以下条件时,将flag
值清空
APP
正常启动10
秒如果在启动阶段发生异常,则flag值不会清空,通过flag值就可以判断客户端是否异常退出,每次异常退出,flag值都+1。
2、安全模式的分级执行策略
分为两级安全模式,连续Crash 2次为一级安全模式,连续Crash
2次及以上为二级安全模式。
业务线可以在一级安全模式中注册行为,比如清空缓存数据,再进入该模式时,会使用注册行为尝试修复客户端
如果一级安全模式无法修复APP,则进入二级安全模式将APP
恢复到初次安装状态,并将Document、Library、Cache
三个根目录清空。
3、热修复执行策略
只要发现配置中需要热修复,APP
就会同步阻塞进行热修复,保证修复的及时性
4、灰度方案
灰度时,配置中会包含灰度、正式两份配置及其灰度概率
APP
根据特定算法算出自己是否满足灰度条件,则使用灰度配置
易用性考量
1、接入成本
完善文档、接口简洁
2、统一配置后台
可按照APP、版本配置
3、定制性
支持定制功能,让接入方来决定具体行为
4、灰度机制
5、数据分析
采用统一数据平台,为安全模式改进提供依据
6、快速测试
创建更多的针对性测试案例,如模拟连续Crash
异常熔断
多次请求失败则可让网络库主动拒绝请求
容灾方案集合路径
功能开关 -> 统跳中心 -> 动态修复 -> 安全模式
开发阶段
CodeReview
机制测试阶段
合码阶段
发布阶段
运维阶段
1、你们做了哪些稳定性方面的优化?
Crash
专项优化根据以上三方面的优化我们搭建了移动端的高可用平台。
2、性能稳定性是怎么做的?
Crash
专项优化3、业务稳定性如何保障?
4、如果发送了异常情况,怎么快速止损?
Android
稳定性优化是一个需要长期投入,持续运营和维护的一个过程,只有深入了解这些底层知识,我们才能比别人设计出更好的稳定性优化方案。