用户都希望用到高品质的App, 所以App的质量至关重要
App的核心质量
- 功能性: 满足用户的需求
- 用户体验: 视觉设计和用户互动体验好
- 性能: 启动速度, 响应速度,网络请求速度等
- 稳定性: 保持长久运行,不崩溃,不报错
稳定
的产品是用户留存的第一道闸门, 是最基本的要求,如何去衡量一个产品或者版本的稳定性呢
稳定性
核心因素就是错误/崩溃
具体可分为崩溃率、崩溃Top、崩溃次数、网络错误率、ANR率、卡顿率
等指标
1.崩溃率
分为两种
-
- UV崩溃率 (Unique Visitor)
-
- = (一段时间)崩溃用户数/活跃用户数
-
- PV崩溃率(Page View)
-
- = (一段时间)所有用户的崩溃总数/所有用户使用总次数
UV(Unique Visitor),即独立访客数,用于了解App的用户规模和访问情况
PV(Page View),表示用户打开App页面数量,用于衡量App流量和用户活跃度。
2.崩溃Top
分为两种
- Top崩溃问题
在一个版本中, 崩溃统计中占比较高的问题, 需要重点关注, 最高优先级
- Top机型: 与特定机型和特定OS版本强相关
3.崩溃次数
- 人均崩溃次数
-
- 一个用户一定时间的崩溃次数
- 页面崩溃次数
-
- 统计App单个页面出现的崩溃次数
4.网络错误率
与网络通信相关的错误都可以归类到网络错误, 包括网络异常、HTTP错误等,
= (一段时间)网络错误次数/网络请求次数
5.ANR率
(Application Not Responding)应用程序无响应,ANR 率即发生 ANR 的次数占总次数的百分比。
6.卡顿率
卡顿是指 App 在使用过程中出现画面不流畅、停顿等现象
卡顿率指的就是卡顿的次数与总使用次数之间的比值。
如何保证质量和稳定性
,下面介绍几种最常用质量监控的手段
一套完美的质量监控包含基本验证、功能测试、兼容性测试、安全性测试、代码质量监测、CI以及线上质量监控
1.基本验证
对App产品最基本的功能验证,包含如下
- APK/IPA验证: 验证App的包名,签名以及版本号等基本信息
- 混淆验证:对APK/IPA进行解压缩,然后反编译,看代码是否混淆
- 安装验证:包括安装、卸载、覆盖、升级、启动和退出等
- 账号验证: 包括注册、登录、退出、多账号登录、多机同时登录
2. 功能测试
- 单元测试
- 用例测试
- 集成测试
- UI测试
- 自动化测试
- 脚本回放测试
不同平台有不同的工具
- Flutter
Flutter 集成测试工具:integration_test
- Android
Android 集成测试工具:Android Gradle Jacoco
- iOS
XCTest和XCUITest框架来进行单元测试和UI测试
3.兼容性测试
- OS版本兼容适配
比如Android 12以上无法使用MediaProvider操作私有文件。需要把文件存储到外部存储的公共目录,以避免这一限制。
iOS也类似
- 厂商兼容适配
针对手机硬件提供商,主要针对Android系统,包括不同芯片平台(如高通,MTK,海思)的适配支持,不同手机平台(华为,小米,oppo等)适配支持, ROM(Android原生ROM,第三方ROM)兼容性适配
- 屏幕分辨率适配
Android和iOS都存在, 针对不同分辨率的屏幕, 如720P, 1080P, 4k等屏
4.安全性测试
包含安全漏洞扫描、权限列表扫描、恶意代码检测以及仿冒应用检查等
5.线上质量监测
是获取App质量问题反馈最直接,最有效的手段,包括用户反馈,数据统计以及Crash监控
- 搭建质量监控平台, 但是成本和代价比较昂贵
- 选择成熟的平台
-
- Bugly(腾讯):Bugly是腾讯推出的一款移动应用性能管理平台,提供实时崩溃监控、卡顿监控、ANR监控、自定义异常监控等功能。它支持Flutter,Android和iOS平台,可以帮助开发者快速发现和定位应用中的问题。
- Crashlytics(Firebase):Crashlytics是Twilio旗下的移动应用崩溃报告工具,提供实时崩溃报告、用户会话追踪、性能监控等功能。它支持Flutter,Android和iOS平台,并且可以与多种开发工具和持续集成/持续部署(CI/CD)平台集成。
- App Analytics(Microsoft):App Analytics是微软提供的一个移动应用性能管理平台,提供崩溃报告、性能分析、用户行为追踪等功能。它支持Android、iOS和Flutter,React Native等平台。
问题处理原则
- 线下问题
指产品未发布,还处于开发,测试或灰度等阶段, 问题比较好处理,可能造成版本发布时间延迟
- 线上问题:
通过质量监控获取到的针对已发布的App包的影响较大问题(通过稳定性衡量指标判断,例如崩溃率>标准指标)
时刻影响着用户体验,及时止损很重要,需要"最大程度最快速的方式降低影响,尽快修复"原则确定紧急处理方案
线上问题修复后,传统方式一般依靠发布新版本,通过用户升级或强制升级来fix,过程漫长
可以采用热修复、热补丁或云端控制
方式来实现线上更新
或止损
云端控制主要在代码中预设开关,针对出现问题的模块进行控制以实际止损
6.App持续集成
(Continus Integration) 英文缩写CI
,
一种软件开发实践, 团队开发成员经常集成他们的工作,每天至少一次,每次集成通过自动化的构建(编译,发布,自动化测试)来验证,从而快速地发现集成错误,大大减少集成的问题,能够更快地开发内聚的软件
产品快速迭代
,同时保持高质量
,
对于移动应用平台,当有人向代码库的主分支提交代码的时候,后台的持续集成服务器会尝试去构建整个产品,包括编译打包,自动化测试,质量分析,输出结果成功或失败
完整的流程如下图所示
Jenkins是一个用Java编写的开源持续集成工具,提供了软件开发的CI服务,可监控并出发持续重复的工作,具有开源,支持多平台和插件扩展,安装简单,界面化管理等优点
更多可以参考官网
7.代码质量监控
App质量和稳定性的很多问题的本质是代码质量问题, 初期,项目规模比较小, 通过简单的测试流程和Code Review就能保证代码质量, 随着功能的快速迭代,项目规模和复杂度日渐扩大,显然我们期许有工具可以帮助我们实现代码质量上的监测
分为两部分
1.Code Review
包括代码规范
的制定以及Code Review
的执行,
2.静态代码分析
Static Program Analysis,简称SPA
,
不运行App
的条件下,进行程序分析的方法
通过词法分析,语法分析,控制流分析,数据流分析
等技术对程序代码进行扫描,找出代码隐藏的错误和缺陷
例如参数不匹配,空指针引用,有歧义的嵌套语句,错误的递归,非法计算等
好处
- 帮助软件开发者自动执行静态代码分析,快速定位代码隐含错误和缺陷
- 帮助代码设计者更专注于分析和解决代码设计缺陷
- 减少Code Review上消耗的时间,提高软件可靠性,节省软件开发和测试成本
通用的静态代码分析系统的流程图,
开发者提交代码到Code Server, Code Server将提交信息以事件通知SPA Server, 触发SPA Server拉取Code Server代码完成扫描分析,再将分析结果邮件通知相关人员
整个流程可以集成到上面的CI(持续集成)流程中,自动扫描分析并输出结果
针对不同语言(Flutter/Android/iOS)有不同的静态代码分析工具
Flutter
- Dart analyzer:Dart的静态代码分析工具,可以在代码执行前发现问题,提高复杂软件代码质量。
- Flutter Lints:一个用于静态代码分析和代码规范检查的工具集合。它基于 Dart 语言提供了一系列的 lint 规则,帮助开发者发现潜在的代码问题,并提供建议和指导以提高代码质量和可维护性。
- Dart Code Metrics:一个静态分析工具,它可以帮助分析和改进代码质量,为 dart analyzer 提供额外的规则,检查反模式,检查未使用的dart文件。
Android
- Android Lint:是Google提供给 Android 开发者的静态代码分析工具,能帮助开发者优化代码和找到潜在的 bug。
- Findbugs:可以检查类文件或 JAR 文件,将字节码与一组缺陷模式进行对比从而发现代码缺陷,完成静态代码分析。
- PMD:通过检查对代码编码格式、命名约定、Javadoc、类设计等方面进行代码规范和风格的检查,从而有效约束开发人员更好地遵循代码编写规范。
- CodeScanner:是一款基于静态代码分析技术的Android代码扫描工具。它可以帮助开发人员快速发现代码中的潜在问题,如内存泄漏、空指针引用、资源未释放等,并提供相应的修复建议。支持多种编程语言,包括 Java 和Kotlin,可以与 Android Studio 集成使用。
iOS
- Clang静态分析:苹果自带的词法分析器,如果需要自定义检测规则,需要重新下载编译llvm,还需要修改Xcode的编译器,配置各种路径,比较繁琐。
- infer:Facebook推出的静态代码检测工具,检测效率高,支持增量分析,支持OC、java等多种语言。但是定制性不强,可自定义规则程度不高,而且暂无法和sonarQube平台配合分析。
- OCLint:建立在Clang上的工具,能够发现代码中潜在的问题,可以用来提高质量和减少缺陷,目前支持C、C++、Objective-C语言。