可靠性是软件一个重要的质量属性,它关注的是软件功能持续的可用性,以及出现故障之后是否能够容错,是否能快速的恢复使用。

可靠性六条基本准则

1、故障应在第一时间被检测和感知;

2、能避免的故障都不应该发生;

3、不可避免或无法预测的故障,需进行容错;

4、已发生故障,需在最短时间内得到恢复;

5、对象状态和生命期都应该是完备的,闭合的;

6、资源必须合理和均衡地使用;

应用作为直接提供用户服务,与用户交互最多的环节,其可靠性对用户体验的影响巨大,甚至会高于系统对用户造成的影响。

可靠性故障的现象及根因

应用不响应(ANR)

(1)应用将耗时操作或者同步调用放在UI线程,广播接收器里处理;

(2)应用资源异常,如内存,文件,线程等的滥用、泄露;

(3)消息、通知过载,忙不过来;

(4)获取系统资源阻塞,比如访问文件系统,数据库,网络,CPU等;

应用启动不起来,界面卡住冻屏,黑屏,白屏

(1)应用启动阶段必现闪退;

(2)应用在启动阶段做了特殊的耗时、阻塞动作;

(3)应用事件处理bug,例如:应用接收事件但不做任何响应;

(4)应用资源异常,获取系统资源阻塞;

(5)应用窗口状态异常,或者使用定制的显示绘制接口导致;

应用闪退或者频繁闪退

(1)低级编码错误,多线程并发错误,app质量不合格;

(2)异常处理不闭合,不完备;

(3)版本兼容性问题,硬件兼容性问题;

Android应用故障案例分享

一、应用资源异常

1、某输入法软件为了保证应用能常驻内存不被系统清理,在应用进程退出时,高频率注册1秒的定时器,定时器到时候,立即拉起该应用及关联应用。如果系统反复清理该应用,该应用会反复自启动,导致系统卡顿很严重。

2、某应用反复注册了800+个应用权限管理的AppOps Listener,在执行callback的时候直接导致system_server进程的global reference table overflow,系统重启。

3、某著名社交软件收到消息通知之前,需要获取通话状态。如果该应用短时间内收到通知消息特别多,直接会将system_server的binder线程全部占满,导致其他应用和服务无法与system_server通信,直接导致系统重启。

二、应用的特殊行为

1、某社交软件在自身升级后的首次启动过程中,长时间进入dex2oat优化过程,应用界面显示黑屏。按back键无效,只能手杀,大量用户反馈手机黑屏死机。

2、某著名社交软件收到消息通知之前,需要获取通话状态。如果该应用短时间内收到通知消息特别多,直接会将system_server的binder线程全部占满,导致其他应用和服务无法与system_server通信,直接导致系统重启。

3、某应用注册加速度传感器以及近距离传感器监听的逻辑:若两个传感器的注册有任何一个失败或者被拒,则会进行无限重试,直到两者全成功,该逻辑会导致距离传感器被反复执行注册,致使system_server的fd数量急速增加,超过1024,导致system_server进程崩溃,系统重启。

三、兼容性问题

1、Google 版本升级导致。应用升级N版本之后,应用频繁闪退,功能缺失,应用无法使用,清除数据和缓存也无效,系统负载高,用户退机。

2、某应用推送最新版本异常。应用升级之后,用户无法使用。

3、ROM升级之后,导致应用无法使用。ROM升级之后,该应用读取电话薄失败,应用频繁Crash,导致手机电话过程中无法挂断。

可靠性设计的一般准则

一、业务功能的可靠性设计

1、合理分配执行任务:哪些放在前台?哪些放在后台?

2、仔细设计任务同步&并发:采用同步还是异步?多任务并发?

3、任务负载的均衡:多个业务执行流有序执行;

4、对象生命周期的闭合;

5、良好的用户交互和提示:别让用户以为应用crash

二、应用数据源可靠性设计

1、应用核心的数据/文件应有备份和容错设计

2、来自外部输入设备的数据,应用应能判别数据的合法性,例如被破坏的数据源,非法的外部数据/命令

3、向外发起的服务请求,要有超时和有限重试设计,外部扰动不导致应用卡死

4、外部发起的攻击性请求,例如通知,广播,要有防护设计

三、应用的资源可靠性设计

1、分配的资源必须在确定的地方释放;

2、使用资源必须有明确的上界,如内存,磁盘,文件,线程。

四、优秀的编码能力

优秀的编码能力是应用可靠性设计的基础;

五、完备的测试故障用例

事先考虑到应用内部、外部可能发生的故障,将故障的集合定义出来,针对性的设计故障用例。

编辑:千锋UI设计

带你认识那些App可靠性设计的更多相关文章

  1. web app升级—带进度条的App自动更新

    带进度条的App自动更新,效果如下图所示:   技术:vue.vant-ui.5+ 封装独立组件AppProgress.vue: <template> <div> <va ...

  2. Do带你解析:原生APP与web APP的区别

    对于DeviceOne原生跨平台APP与WEB APP的区别,很多人还不是很清楚,下面就让小编来简单介绍DeviceOne原生APP的功能以及与WEB APP的区别. 定义,什么是原生APP和web ...

  3. Applescript 带参数调用某个App的方法

    do shell script "open '/Users/eran/Documents/Workground/DragonAdventure/FlashCode/tools/SWFInfo ...

  4. C# 如何实现带消息数的App图标

    上次写了一篇博文,但是每次更新图标时,桌面会闪烁(刷新),有博友说人家的图标都不会刷新,还能动画.我想了一下,如果要达到这个效果,可以用Form来实现,就是在Form中嵌入一个图片,然后用一个labe ...

  5. 使用sdk自带工具uiautomatorviewer查看app控件属性

    双击打开即可 其只显示模拟器中的当前页面,所以需要在模拟器中打开你需要的页面,然后刷新

  6. 【总结整理】自带天气app,为什么还要下载

    很简单那就说明用户对天气这个功能的需求并没有表面那么简单呗,还有更深层次的需求~ 先声明我自己是没有这方面需求的,我就纯属YY一下 既然数据都一样的话,那是什么让用户觉得天气APP更专业呢? 1.历史 ...

  7. App Store最新审核标准,中文版

    App store最新审核标准(2015.3)公布 1. 条款和条件 1.1 为App Store开发程序,开发者必须遵守 Program License Agreement (PLA).人机交互指南 ...

  8. 使用Burpsuite抓取手机APP的HTTPS数据

    1.所需条件 · 手机已经获取root权限 · 手机已经成功安装xposed框架 · 电脑一台 2.详细步骤 2.1 在手机上面安装xposed JustTrustMe JustTrustMe是一个去 ...

  9. 【转】总结:2015这一年App Store审核指南都有哪些变化

    本文针对此前版本的<App Store审核指南>进行了更新,并标注了2015年苹果对<App Store审核指南>进行的一些调整. App Store Review Guide ...

随机推荐

  1. 代码生成器 CodeSmith 的使用(一)

    由于在项目中经常要会用到数据库的 CRUD 操作(增.删.改.查),而且还使用的是orm 框架将数据库表名和表中的的字段映射成相应的类属性.如果把大量的时间用到手工输入数据库表中的字段,除了能练习打字 ...

  2. uva146-枚举,排列

    题意: 输入最多150个小写字母,在字典序增大的方向,求下一个排列是什么. 模拟枚举,最后一个字符是递归的最后一层(n层),那么把它弹出栈(还剩n-1层),如果n-1层的字符比第n层小,说明把n层的字 ...

  3. spring securiry Xml 配置 登陆

    参考:https://blog.csdn.net/yin380697242/article/details/51893397 https://blog.csdn.net/lee353086/artic ...

  4. php中array_map和array_walk的使用对比_php技巧

    一.array_map() 1.array_map() 函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组,若函数作用后无返回值,则对应的新值数组中为空. 2.回调 ...

  5. 19.OGNL与ValueStack(VS)-OGNL入门

    转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html 下面我们在com.asm.vo.User类中增加一个字段private Ad ...

  6. JSON.Stringify()和JSON.parse()的比较使用

    1.  JSON.Stringify() 将一个对象解析成字符串 <script> function myonclick() { var value = $('select option: ...

  7. Spring Boot 入门搭建

    一.前言 Spring Boot 的设计目的是用来简化新 Spring 应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置. 二.环境搭建 创建一个 ...

  8. 基于OpenGL编写一个简易的2D渲染框架-06 编写一个粒子系统

    在这篇文章中,我将详细说明如何编写一个简易的粒子系统. 粒子系统可以模拟许多效果,下图便是这次的粒子系统的显示效果.为了方便演示,就弄成了一个动图. 图中,同时显示了 7 种不同粒子效果,看上去效果挺 ...

  9. ABAP-Generate subroutine

    1.定义 data:zprog like abapsource occurs with header line, prog() type c, msg() type c. 2.动态语句 zprog-l ...

  10. objective C, parse json时注意事项

    例: dict为从API请求返回的json调用 NSJSONSerialization JSONObjectWithData:方法得到的NSDictionary实例. 当执行以下语句时linkStri ...