如何确保程序的稳定性 - Android
本文主要从App-Android的视角来看,后学末进初来乍到欢迎打脸。
个人觉得要确保一个程序的稳定应该从这几个方面来分析。
- 代码
- 程序框架和设计模式
- 内存管理
- 线程管理
- 静态代码分析工具
- 容错处理-主动捕捉敏感数据异常
- 日志收集
- 测试
- 单元测试
- 压力测试
- 流程测试
- 异常修复制度
- 根据收集到的日志修复bug
- 生成补丁,发布更新
代码层面
程序框架和设计模式
这个不太敢说太多,看具体场景和自己能力做到尽量封装复用代码,解耦各个类之间的关系。下面简单说一下几种框架:
- MVC:简单易用,复用率不高,在android中:controller和view划分不明显全部放在activity里面,造成巨大无比的类,代码的可阅读性降低,维护难,急需拆分。
- MVP:在android上实现了更清晰的三层划分,不再是View和Control傻傻分不清了,虽然在activity里面还是会有部分逻辑,不过也不打紧。缺点也有,复用多了容易造成大面积的case。
- MVVM:mvvm借鉴于web前端的思路,每个html配套js能够实现更方便的组装。然而在Android里面xml的存在感和功能太弱了,直到DataBinding的出现。
内存管理
常见的内存问题是: 内存泄漏和 内存溢出,网上有非常丰富的教程,这里就不再赘述。
这些年技术更新的有点快,避免大家走弯路,建议这么三个工具给大家学习:
- strictMode 严苛模式。
- 应用场景:通常在开发完成之后,用严苛模式跑压测。
- leakCanary 金丝雀,
- 开发过程中配置,开发中就能查看到内存泄漏的引用链。
- Profile Android studio自带的工具。
- 应用场景:程序在某个界面变得卡顿退出后又回复顺畅,常见现象是是内存抖动。
- 这种现象不常见,而这个工具太过于手动了,对能力要求高,解决问题能力效率低,新手不建议去玩。
线程的管理
线程处理不当通常会造成如下问题:内存泄漏,多线程数据重复,脏数据...
- 内存泄漏:
- 常见场景有:自定义线程,Task队列,handler队列,广播队列,自定义动画...
- 解决方式:使用严苛模式排查,跟随创建的根结点销毁而销毁。
- 多线程数据同步问题
- 略过,能力限制,一两句说不清,而前端也很难碰到这种情况。能时机成熟再立新贴。
静态代码分析工具
静态代码分析工具能有效的寻找Java代码中Bug,下面例举两个工具,有时间我会补充两个工具的用法。
- lint
- FindBugs
容错处理
怎么说呢,经常碰到我们开发测试的时候运行正常,但是到了测试或者客户手上的时候问题不断。究其原因:一方面是数据源出了问题,另外一方面是我们对这些部分没有主动进行容错处理。通常需要我们对这些地方进行异常捕捉,也许某个功能无法正常使用,但是终究不会引发崩溃。
下面例举一些常见场景:
- 字符串操作:
- 字符串变换,截取...常见异常有空指针,长度越界,碰到这类操作的时候,我们最好是封装一个工具类,对整个方法进行异常捕捉
- 数组操作:
- 同字符串的处理一样,很容易出现空指针和数组越界
- 网路数据获取,这里情况就有点多了
- 空数据
- 对象转换
- 错误数据初始化UI,导致crush
日志收集
首先明确一点:发布到客户手里的程序必须是不稳定的。在这种情况下日志收集就十分重要了,下面例举两种日志收集的方式。
- 三方平台,比如说:友盟,bugly...
- 自己封装UncaughtException,然后上传到自己的服务器
测试层面
因为不是专业测试,欢迎指点。
单元测试
单元测试是指对软件中的最小可测试单元进行检查和验证。
场景:在现实开发过程中,绝大多数公司都把这部分工作丢给测试去做,除非初次上线,后面都会省略这个步骤,或者不会覆盖所有场景。
我觉得最好还是程序员自己编写单元测试代码,至少数据的入口都写一下测试代码。
压力测试
场景:我们开发的程序可能运行在各种复杂的环境,经历着不可预知的操作。
为了预防和模拟这类情况,还有什么比用Monkey做个压力测试更好的呢?
一条指令,多台测试机,几个小时之后去接收结果。强烈推荐这个测试,再懒的人也不应该忽略这个测试。
流程测试
场景:经历过很多项目组,很多时候开发完一个需求,只对新功能做测试,然后火急火燎的上线,覆盖率严重不足,说实在的上线后经常有睡不着的时候。
为了让上线前各个流程都能正常使用,下面例举两个工具,个人觉得是最容易上手的:
- Espresso :Android studio的插件,可以录制用户的操作生成一段java代码,后续执行这段代码就可以重复流程
- 优点:要求低不需要写代码,搭建好环境就能开始录制
- 缺点:录制过程极其卡顿
- Monkey Runner:官方出了比较久的一个工具,使用python来写测试脚本,初级功能只有十个左右的指令,
- 优点:功能强大,容易学习
- 缺点:全套流程下来,代码量有点大
异常修复制度
根据收集到的日志修复bug
定期或者邮件通知到开发,随时维护线上的bug,最好做到发现后即时修复。
生成补丁,发布更新
发现了异常最好是做到在小部分人受到影响的时候,已经将补丁包无感知的发送到所有客户手上修复了bug。
现在网上有不少开源的热修复代码,但是自己搭建框架难度有点大。大公司有要求的话自己去折腾一下,小公司建议直接用第三方的。部分平台上装机量少的app是可以免费使用他们的热修复的。
下面例举两个平台:
- 阿里的hotfix
- 腾讯的Tinker
如何确保程序的稳定性 - Android相关推荐
- 如何确保API 的稳定性与正确性?你只需要这一招
一.什么是rest-assured 现在,越来越多的 Web 应用转向了RESTful的架构,很多产品和应用暴露给用户的往往就是一组 REST API,这 样有一个好处,用户可以根据需要,调用不同的 ...
- 如何将Felgo程序部署到Android中
概述 经过前面两篇文章的描述,我们知道了Felgo的大致应用,Felgo支持跨平台 windows.macos.Linux以及移动平台Android.IOS.Windows Phone和Windows ...
- Qt将应用程序部署到Android设备
Qt将应用程序部署到Android设备 将应用程序部署到Android设备 指定软件包的设置 选择API级别 建立AAB 签署Android套件 添加外部库 编辑清单文件 包装名称 造型风格 屏幕方向 ...
- Qt Creator将应用程序部署到Android设备
Qt Creator将应用程序部署到Android设备 将应用程序部署到Android设备 包装应用 指定软件包的设置 选择API级别 建立AAB 签署Android套件 添加外部库 编辑清单文件 包 ...
- android程序root权限,android – 如何从源代码授予对特定应用程序的root访问权限而不是root权限?...
我正在从源代码编译Android ROM,我有一个应用程序,我希望它预先安装并让它以root权限运行. 如何在不支持整个ROM的情况下授予对此特定应用程序的root访问权限? 解决方法: 希望你不需要 ...
- 怎么用程序实现调用Android手机的拍照功能
怎么用程序实现调用Android手机的拍照功能 转载于:https://blog.51cto.com/1553021/643408
- android程序导入虚拟机,android项目打包成apk应用程序后部署到虚拟机上测试
一:打包成apk包 这个比较简单,如下 右键点击项目--> export --> android Project --> 选择密钥等信息 --> 填写密钥信息 --&g ...
- 推测用户行为 程序员分享Android开发经验
从G1上市到现在,市面上已经出现了至少30款Android手机.为什么至今依然有一些用户在抱怨Android不好用,在相关的开发中,什么才是真正值得关注的,开发的核心是什么?为什么移动应用需要格外关注 ...
- java检测安卓程序退出_java – 退出应用程序时的Android停止服务
我正在创建一个带有背景音乐的游戏应用程序.我使用Android服务进行游戏 背景音乐,因为我想在改变活动时运行BGM. 我的问题是,我在每个活动中的onPause方法中声明了finish()(我不想让 ...
最新文章
- mysql 用drop和delete方法删除用户的区别
- JS 将负数转化为正数
- 实现对象的复用——享元模式
- vue项目使用electron打包成桌面应用
- 读后有感 - UI设计师必知:线框图、原型和视觉稿
- Java 11 升级:“债务”“危机”
- 3dmax:3dmax三维VR渲染设置之摄像机设置(修改摄像机、创建摄像机及其基本参数{视野、正交投影、镜头、环境范围、剪切平面、多过程效果、运动模糊、景深参数、运动模糊参}解释等)图文教程之详细攻略
- idea怎么设置类备注和方法备注的格式
- 从前端到全栈-基础能力-js-异步编程
- 第5-6课:关键路径算法
- CSS3 实现可爱的动物动态的哈士奇动画
- Android 应用提示Detected problems with API问题
- 【Android 开发】mac 版 Android Studio 连接夜神模拟器的方法
- 微信小程序——获取步数
- 计算机网络——(6)网络互联技术与设备
- 果壳网科学人文章采集爬虫分享
- 学习社会工程学需要什么前置知识
- 医院his系统更换替换服务器,更换HIS时的数据迁移注意事项
- 在mm32f3270上为MicroPython启用Timer模块
- Android-客户端上传多张图片到服务器功能实现