本篇只是站在大佬们的肩膀上,供给一些个人关于稳定性建设计划思路,欢迎大家探讨
界说: 这儿的Android稳定性单指Crash
指标口径: 用户可感知溃散率,以用户为纬度,即Crash设备数 / 总设备数
精细化单个bug的纬度:
- bug频次
- 爆炸半径
- 影响时长
从溃散的产生处理整个链路出发: RD编码 –> 线下测验 –> 灰度发版 –> 溃散产生&数据采集聚类 –> RD修正 –> 版别发布
全体思路
1、编码阶段
制定代码规范,加强代码Review,引入静态代码检查,完善测验流程等削减问题产生
a、静态代码检查
有时会呈现某些初级过错如:divide by zero 导致的crash,运用Lint和detekt进行静态代码检查不失为一种好计划,能够放在代码合入的SA阶段
b、检查是否需求处理警告问题
在我们编码或许改动前史遗留的代码时,AS中存在一些警告⚠️,commit时要根据提示进行review,是否需求每次修正和改动还有待商榷
c、检测SQL质量
参阅Matrix SQLite Lint: 按官方最佳实践自动化检测 SQLite 句子的运用质量;(看能否拓展到其他场景)
d、依赖库的检查 (能够跟组件化相关)
选用gradle脚本编译时检查依赖库是否相同,处理不同组件或许不同APP之间SDK版别不一致可能导致的溃散,防止CI阶段打包失利或许上线后呈现异常
- 新增or改动SDK检测,CI diff 产出依赖树 全功能提测阶段
e、review规范
- 提交reviewer的质量把控认识;要害代码需求两个人review,+1 +2经过才能够合入
- 跟流水线CI自动识别中心类文件要求两人review的才能结合起来
2、测验&流水线
进步稳定性的认识,不论多微小的改动都要进行自测!!!
a.单元测验
- 重点模块的单测才能
b.自动化测验
- 结合QA补齐自动化测验的才能,掩盖中心场景
- 跟devops渠道才能结合,将LeakCanary等才能跟Monkey结合,自动创立卡片
- 针对函数接口的异常数据排雷测验(参阅/post/702812…)
c.CI/CD
- 流水线打包效率提高
3、溃散数据采集&剖析
正如RD讲的那样,给我一个溃散仓库我就能定位到问题所在,能完好的复原”事故现场”成为重中之重
a.仓库反混杂
结合各个公司APM渠道上传mapping文件以及符号表,每个溃散数据均展现混杂之前的定位
b.渠道仓库聚类
- 接入iqiyi开源的XCrash库或许breakpad,上报java和native的溃散仓库到Server并聚类展现
- 接入开源的Sentry库并搭建本地私有化服务,完成溃散的上报和聚类
c.渠道数据状况标识
已修正、Pending、下个版别修正等状况或许备注的标识,每次剖析成果留下文字记载
d.分模块上传要害数据
会员模块上传会员信息、支付模块上传订单信息等
4、灰度阶段
a.测验轨迹前置小版别提早暴露问题
b.三方SDK降级战略
firebase、广告库等三方SDK升级一定要调查溃散率变化,并做好降级处理
c.crash率异常熔断机制
- 灰度进程短少中间对Crash率异常的鉴定规范,业务异常的鉴定规范
- 全体&每个溃散数据的量级(该溃散人数/安装率)记载,设定阈值,每日将两个版别比照骤增或许骤降的数据输出并产出陈述
c.上车战略
中心思路是代码改动最小化,预留todo下迭代改,防止构成新的线上crash
5、重点问题处理
I.源码剖析
尽管 androidxref.com 和 cs.android.com 都能够在线查阅源码,但这两处的Android版别并不全;android.googlesource.com 这儿能够下载到简直一切版别的源码,本地经过 Sublime 剖析源码也非常方便(能够直接显示和跳转到方法的界说&引用方位)。
II.OOM问题
a.大图监控管理
- 线下监控:经过插件在 mergeResources 任务后,遍历图片资源,收集超过阈值的图片资源,输出列表
- 参阅NativeBitmap 把应用内存运用的大头(即 Bitmap 的像素占用的内存)转移到 Native 堆;但是可能会导致32位虚拟内存不足
- 在接口层中将一切被创立出来的 Bitmap 参加一个 WeakHashMap,同时记载创立 Bitmap 的时间、仓库等信息,然后在恰当的时分检查这个 WeakHashMap 看看哪些 Bitmap 依然存活来判别是否呈现 Bitmap 乱用或走漏。 微信 Android 终端内存优化实践
b.hook pthred
选用bhook,针对pthread_create创立的子线程中产生了信号(SIGSEGV)进行兜底操作;相当于catch native crash,产生crash时重新履行之前的逻辑
c.32位虚拟内存优化
-
Patrons 经过一系列技能手段完成运转期间动态调整
Region Space
预分配的地址空间 - mSponge 优化了虚拟机对 LargeObjectSpace 的内存办理战略,间接添加其它内存空间运用上限 (未开源)
- pthread hook 对 native 线程的默许栈大小进行折半
d.监控
接入KOOM,进行线下OOM产生时的采样上报
III.native crash
- google官网供给的native crash问题确诊思路
- 对Native Crash进行捕获,自界说完成自己的重启逻辑,比如重启/自界说上报crash等等
- 加载so失利,尝试用java替代的降级战略
6、防裂化&基础建设
a.版别回忆
溃散数据自动化采集,以月度或许季度为纬度爬取数据,构成总结
b.溃散维护和安全形式机制
- 经过ASM在编译时对四大组件生命周期等要害代码加上try-catch处理
- 经过一定的战略,针对重复重启导致的溃散问题,让用户挑选继续初始化或许清除数据
c.日志回捞
- 全埋点用户操作路径辅佐剖析
- 参阅Logan进行日志回捞系统的建设,方便针对某一用户产生问题后捞回日志剖析
d.移动端性能中台
自建集溃散监控、上报、剖析、归因于一体(能够参阅Matrix直接建立),能够轻松定位各种线上疑难杂症,更有超具体性能、卡顿、打点等全流程监控处理渠道
参阅:
- 美团外卖Android Lint代码检查实践 /post/684490…
- 货拉拉稳定性 /post/710074…
- 美团外卖Android Crash管理之路 /post/684490…
- 【得物技能】得物App Android Crash管理演进 /post/700106…
- 快手客户端稳定性系统建设_如果activity的mdestroyed值为true时(ondestroy时赋值),说明activ_快手技能团队的博客-CSDN博客