Android开发Android开发经验谈Android开发

关于 Android 稳定性优化你应该了解的知识点

2022-08-05  本文已影响0人  Android技术圈

前言

Android 稳定性优化是一个需要长期投入,持续运营和维护的一个过程,不仅深入探讨了 Java Crash、Native Crash 和 ANR 的解决流程及方案,还分析了其内部实现原理和监控流程。本文对稳定性优化方面的知识做了一个全面总结,主要内容如下:

如何提升App的稳定性

一般性的App能接触到稳定性的需求其实并不多,只有大型的处于稳定运营期的App才会重视App的稳定性,稳定性实际上是一个大问题,一个稳定的产品才能够保证用户的留存率,所以稳定性是质量体系中最基本也是最关键的一环:

稳定性维度

稳定性优化概述

如果App到了线上才发现异常,其实已经造成了损失,所以稳定性优化重点在于预防

如何有效降低应用崩溃率

Crash相关指标

1.UV、PV Crash率

2.Java、Native Crash率

3.启动、重点流程Crash率

4.增量、存量Crash率

5.Crash率评价指标

Crash关键问题

1.尽可能还原Crash现场

一旦发生崩溃,我们需要尽可能保留崩溃现场信息,这样有利于还原崩溃发生时的各种场景信息,从而推断出可能导致崩溃的原因,对于采集环节可以参考以下采集点:

上面是一张Bugly后台的截图,对于成熟的性能监控平台不仅有Crash的单独信息,同时会对各种Crash进行聚合以及报警。

2.APM后台聚合展示

3.Crash相关的整体架构

4.非技术相关的关键问题

建立规范的流程保证开发人员能够及时处理线上发生的问题:

单个Crash处理方案

Crash率治理方案

通过以上几点应该可以解决大部分的存量Crash,同时再控制好新增Crash,这样一来整体的Crash率一般都能够得到有效降低。

这一部分的内容有点杂而多,一般也是需要多端配合,所以不太好做具体演示,大家可以在网上多查找相关资料进行巩固学习。

如何选择合适的崩溃服务

  1. 腾讯Bugly: 除了有crash数据还有运营数据
  2. UC 啄木鸟:可以捕获Java、Native异常,被系统强杀的异常,ANR,Low Memory Killer、killProcess。技术深度以及捕获能力强
  3. 网易云捕:继承便捷,访问快,捕获以及上报速度及时,支持实时报警,提供多种报警选项,可以自定义参数。
  4. Google的Firebase
  5. crashlytics:服务器在国外,访问速度慢,会丢掉数据
  6. 友盟:crash之后会在再次启动的时候上报数据,所以不能立即获得这部分信息

移动端业务高可用方案

移动端高可用方案不仅仅是指性能方面的高可用,业务方面的高可用也是尤为重要的,如果业务都走不通,试问你性能做的再好又有何用呢?

对于业务是否可用不像Crash一样,如果发生Crash我们可以收到系统的回调,业务不可用实际上我们是无从知道的,所以针对建设移动端业务高可用的方案总结以下几点:

1.数据采集

2.报警策略

3.异常监控

这里简单的举个栗子,表明意思:

        try {
            //业务处理
            LogUtils.i("...");
        }catch (Exception e){
            //如果未加上统计,就无法知道具体是什么原因导致的功能不可用
            ExceptionMonitor.monitor(Log.getStackTraceString(e));
        }
 
        boolean flag = true;
        if (flag){
            //正常,继续执行相关任务
        }else {
            //异常,不执行任务,这种情况产生的异常也应该进行上报
            ExceptionMonitor.monitor("自定义业务失败标识");
        }        

4.单点追查

5.兜底策略

当你通过监控了解到业务不正常之后,请问该如何修复?这里就要用到兜底策略了,就是到了最后一步各种措施都做了,用户还是出现了异常,这种情况仍然还是要有相关联的配置手段来达到高可用。对于业务上的异常除了热修复的手段之外,还可以通过建立配置中心,将功能开关关闭。

移动端容灾方案

移动端容灾必要性

说到容灾,首先来看一下需要防范的灾是什么?主要分为两部分:性能异常和业务异常,只要是对用户的实际体验产生了很大的影响,都是需要防范的App线上灾害。

传统的流程是如何处理线上出现的紧急问题的呢?传统的处理流程首先需要用户反馈出现的不正常情况,接着开发人员进行紧急的BUG修复,然后重新打包上传渠道进行更新,可见传统的流程比较繁琐,灵敏度较低,如果日活量较高,随着Bug在线上存活的时间延长对用户基数的影响是巨大的,势必是无法接受的

移动端容灾最佳实践

1.功能开关

这里简单的做个演示:

public class ConfigManager {
 
    public static boolean mOpenClick = true; //默认值为true
 
}
 
mAdapter.setOnItemClickListener((view, position) -> {
            //控制点击事件是否开启
            if (ConfigManager.mOpenClick){ //mOpenClick的值从接口获取,由服务端控制
                //处理具体业务
            }
        });

2.统跳中心

组件化之后的项目的页面跳转都是通过路由来做的,如果发现线上产生了异常,可以在路由跳转这一步拦截有Bug的跳转,重定向到备用方案,或者统一的错误处理中界面,更多的情况是为了对线上用户产生的影响降到最低,如果有Bug不能进行热修复,也没有合适的开关可用,会做一个临时的H5页面,让用户点击之后跳转到临时的H5页面,这样用户还是可以操作,只是在体验上稍微差一点,总归来说比不能用强的多

3.动态化修复

目前为止,国内市场安卓的热修复方案已经比较成熟了,对于大型项目来说,一般都会支持热修复的能力,热修复技术就是用户不需要重新安装一个Apk,就可以实现比原有Apk有较大更新的能力,比如微信的Tinker和美团的Robust都是非常好的热修复实现方案。需要注意的是,热修复也只是一个功能,对于热修复也需要加上各种完善的统计,需要知道热修方案是否真正有效果,没有用造成更大的损失

4.安全模式

安全模式侧重于移动端发生严重Crash时的自动恢复,做的好的安全模式往往会有几级不同的策略,比如App多次启动失败,那就重置整个App到安装的状态,避免因为一些脏数据导致的App持续闪退,同时如果有Bug并且非常严重到了最严重的等级,可以采用阻塞性热修来解决,即:必须等热修成功之后才可进入主页面。需要注意的是,安全模式不仅仅可以针对App Crash,也可以针对一些组件,比如网络请求多次失败后也可以进入安全模式,暂时拒绝用户的网络请求,避免给服务端造成的额外压力

容灾方案总结:

这几种方式是由简单到复杂的递进,为了保障线上的稳定性,最好在应用中多加入几个稳定性保障方案。

稳定性长效治理

对于稳定性优化来说是一个细活,需要打持久战,不能一个版本优化了,后面又恶化了,因此需要在项目开发的整个周期内的不同阶段都加上相应的方案。

1.开发阶段

在开发阶段组内每个开发人员的编码实力都是不一样的,因此需要统一编码规范,然后结合一些手段增强人员的编码功底,尽可能的将问题消灭在编码阶段,尽可能的写出高质量的代码,同时要结合开发阶段的技术评审,以及每天的互相CodeReview机制,坚持几个月编码水平肯定会有明显的提升,开发阶段明显的问题应该就不会再有了,而且代码风格结构也会大体一致。同时开发阶段还需要做的事情就是架构优化,项目的架构应该根据项目的不同发展阶段来不断优化,这里说两点,第一能力收敛比如界面切换的能力用路由来实现,对网络请求要统一网络库统一使用方式,这样可以避免不正当的使用带来的Bug,第二统一容错,比如对于网络请求来说可以在网络请求回来的时候加上预先校验,判断回来的数据是否合法,如果不合法就不需要再把数据转给上层业务了

2.测试阶段

3.合码阶段

开发时肯定是在自己的分支进行开发,测试通过之后才会往主干分支合入,合入之前首先需要进行代码的编译检查和静态扫描发现可能存在的问题,经过校验之后也不能直接合入,应该将自己的分支首先合入到一个和主干分支一样的分支中进行预编译,编译通过之后最好加上主流程的回归测试

4.发布阶段

到了发布阶段一般来说App都是经过了开发自测、QA测试、内部测试等测试环节,相对来说比较稳定了,但是需要注意的是,很多问题你不可能全部测出来,所以必须谨慎对待

5.运维阶段

任何一个小问题在海量用户面前都会影响巨大,因此这个阶段必须要依靠APM的灵敏监控

如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙: 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。

性能系列专栏其他文章

关于 Android内存优化你应该了解的知识点
关于 Android启动优化你应该了解的知识点
Android卡顿优化分析及解决方案,全面掌握
关于Android UI绘制优化你应该了解的知识点

上一篇下一篇

猜你喜欢

热点阅读