赞
踩
目录
上一篇中我们说到了Android应用的瘦身优化——《深入探索Android应用瘦身优化》,今天一起来学习一下应用的稳定性优化,废话不多说了,我们直接进入主题!
一般性的App能接触到稳定性的需求其实并不多,只有大型的处于稳定运营期的App才会重视App的稳定性,稳定性实际上是一个大问题,一个稳定的产品才能够保证用户的留存率,所以稳定性是质量体系中最基本也是最关键的一环:
如果App到了线上才发现异常,其实已经造成了损失,所以稳定性优化重点在于预防
①、UV、PV Crash率
②、Java、Native Crash率
③、启动、重点流程Crash率
④、增量、存量Crash率
⑤、Crash率评价指标
①、尽可能还原Crash现场
一旦发生崩溃,我们需要尽可能保留崩溃现场信息,这样有利于还原崩溃发生时的各种场景信息,从而推断出可能导致崩溃的原因,对于采集环节可以参考以下采集点:
上面是一张Bugly后台的截图,对于成熟的性能监控平台不仅有Crash的单独信息,同时会对各种Crash进行聚合以及报警。
②、APM后台聚合展示
③、Crash相关的整体架构
④、非技术相关的关键问题
建立规范的流程保证开发人员能够及时处理线上发生的问题:
通过以上几点应该可以解决大部分的存量Crash,同时再控制好新增Crash,这样一来整体的Crash率一般都能够得到有效降低。
这一部分的内容有点杂而多,一般也是需要多端配合,所以不太好做具体演示,大家可以在网上多查找相关资料进行巩固学习。
移动端高可用方案不仅仅是指性能方面的高可用,业务方面的高可用也是尤为重要的,如果业务都走不通,试问你性能做的再好又有何用呢?
对于业务是否可用不像Crash一样,如果发生Crash我们可以收到系统的回调,业务不可用实际上我们是无从知道的,所以针对建设移动端业务高可用的方案总结以下几点:
①、数据采集
②、报警策略
③、异常监控
这里简单的举个栗子,表明意思:
- try {
- //业务处理
- LogUtils.i("...");
- }catch (Exception e){
- //如果未加上统计,就无法知道具体是什么原因导致的功能不可用
- ExceptionMonitor.monitor(Log.getStackTraceString(e));
- }
-
- boolean flag = true;
- if (flag){
- //正常,继续执行相关任务
- }else {
- //异常,不执行任务,这种情况产生的异常也应该进行上报
- ExceptionMonitor.monitor("自定义业务失败标识");
- }
④、单点追查
⑤、兜底策略
当你通过监控了解到业务不正常之后,请问该如何修复?这里就要用到兜底策略了,就是到了最后一步各种措施都做了,用户还是出现了异常,这种情况仍然还是要有相关联的配置手段来达到高可用。对于业务上的异常除了热修复的手段之外,还可以通过建立配置中心,将功能开关关闭。
说到容灾,首先来看一下需要防范的灾是什么?主要分为两部分:性能异常和业务异常,只要是对用户的实际体验产生了很大的影响,都是需要防范的App线上灾害。
传统的流程是如何处理线上出现的紧急问题的呢?传统的处理流程首先需要用户反馈出现的不正常情况,接着开发人员进行紧急的BUG修复,然后重新打包上传渠道进行更新,可见传统的流程比较繁琐,灵敏度较低,如果日活量较高,随着Bug在线上存活的时间延长对用户基数的影响是巨大的,势必是无法接受的
①、功能开关
这里简单的做个演示:
- public class ConfigManager {
-
- public static boolean mOpenClick = true; //默认值为true
-
- }
-
- mAdapter.setOnItemClickListener((view, position) -> {
- //控制点击事件是否开启
- if (ConfigManager.mOpenClick){ //mOpenClick的值从接口获取,由服务端控制
- //处理具体业务
- }
- });
②、统跳中心
组件化之后的项目的页面跳转都是通过路由来做的,如果发现线上产生了异常,可以在路由跳转这一步拦截有Bug的跳转,重定向到备用方案,或者统一的错误处理中界面,更多的情况是为了对线上用户产生的影响降到最低,如果有Bug不能进行热修复,也没有合适的开关可用,会做一个临时的H5页面,让用户点击之后跳转到临时的H5页面,这样用户还是可以操作,只是在体验上稍微差一点,总归来说比不能用强的多
③、动态化修复
目前为止,国内市场安卓的热修复方案已经比较成熟了,对于大型项目来说,一般都会支持热修复的能力,热修复技术就是用户不需要重新安装一个Apk,就可以实现比原有Apk有较大更新的能力,比如微信的Tinker和美团的Robust都是非常好的热修复实现方案。需要注意的是,热修复也只是一个功能,对于热修复也需要加上各种完善的统计,需要知道热修方案是否真正有效果,没有用造成更大的损失
④、安全模式
安全模式侧重于移动端发生严重Crash时的自动恢复,做的好的安全模式往往会有几级不同的策略,比如App多次启动失败,那就重置整个App到安装的状态,避免因为一些脏数据导致的App持续闪退,同时如果有Bug并且非常严重到了最严重的等级,可以采用阻塞性热修来解决,即:必须等热修成功之后才可进入主页面。需要注意的是,安全模式不仅仅可以针对App Crash,也可以针对一些组件,比如网络请求多次失败后也可以进入安全模式,暂时拒绝用户的网络请求,避免给服务端造成的额外压力
这里推荐一篇文章:《安全模式:天猫App启动保护实践》
容灾方案总结:
功能开关---》统跳中心---》动态修复---》安全模式
这几种方式是由简单到复杂的递进,为了保障线上的稳定性,最好在应用中多加入几个稳定性保障方案。
对于稳定性优化来说是一个细活,需要打持久战,不能一个版本优化了,后面又恶化了,因此需要在项目开发的整个周期内的不同阶段都加上相应的方案。
①、开发阶段
在开发阶段组内每个开发人员的编码实力都是不一样的,因此需要统一编码规范,然后结合一些手段增强人员的编码功底,尽可能的将问题消灭在编码阶段,尽可能的写出高质量的代码,同时要结合开发阶段的技术评审,以及每天的互相CodeReview机制,坚持几个月编码水平肯定会有明显的提升,开发阶段明显的问题应该就不会再有了,而且代码风格结构也会大体一致。同时开发阶段还需要做的事情就是架构优化,项目的架构应该根据项目的不同发展阶段来不断优化,这里说两点,第一能力收敛比如界面切换的能力用路由来实现,对网络请求要统一网络库统一使用方式,这样可以避免不正当的使用带来的Bug,第二统一容错,比如对于网络请求来说可以在网络请求回来的时候加上预先校验,判断回来的数据是否合法,如果不合法就不需要再把数据转给上层业务了
②、测试阶段
③、合码阶段
开发时肯定是在自己的分支进行开发,测试通过之后才会往主干分支合入,合入之前首先需要进行代码的编译检查和静态扫描发现可能存在的问题,经过校验之后也不能直接合入,应该将自己的分支首先合入到一个和主干分支一样的分支中进行预编译,编译通过之后最好加上主流程的回归测试
④、发布阶段
到了发布阶段一般来说App都是经过了开发自测、QA测试、内部测试等测试环节,相对来说比较稳定了,但是需要注意的是,很多问题你不可能全部测出来,所以必须谨慎对待
⑤、运维阶段
任何一个小问题在海量用户面前都会影响巨大,因此这个阶段必须要依靠APM的灵敏监控
好了,关于App稳定性优化的相关内容就说到这里了,下期再见!
祝:工作顺利!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。