客户端稳定性异常检测(函数接口“扫雷”实践)
文章图片
作者:安晴
背景
在过去的财年中,支付宝客户端高可用团队持续保障着支付宝客户端线上的高可用稳定性,但只有线上的应急快反能力是不够的,还需要线下提前发现客户端的稳定性风险建设风险挖掘能力,完善整体的客户端高可用保障体系。通过总结过去1-2年的线上闪退问题可以发现其中NPE问题,RPC数据类型不匹配和config变更导致的闪退问题占比较大,完全可以在线下通过一定机制提前发现。
基于此我们对影响稳定性的因素进行分类,按照优先级构建了客户端的稳定性“扫雷”体系,主要包括函数接口扫雷,rpc&config&jsapi扫雷,scheme&广播&通知扫雷,lottie&antmation&鸟巢模板变更扫雷等,通过这套扫雷能力建设我们希望可以完全避免线上出现以上稳定性故障,同时以issue的形式推动研发优化代码,不断提高客户端稳定性,从事前的角度去完善客户端高可用保障体系。
技术方案
根据经验分析在客户端的函数调用中由于对函数参数检查不够导致的各类闪退问题占比在20%左右。现阶段方案Android端针对public和private的static静态接口,iOS端针对所有public接口进行Fuzz测试,通过对安装包扫描获取到全量的接口函数信息,然后对函数入参Fuzz制造各类异常场景,测试客户端的稳定性。
与传统的代码静态扫描相比,本方案在真实客户端上执行,贴近真实场景可制造真实的异常数据。整个技术实现方案包括以下几点:
- 代码扫描给出详细接口文件
- 客户端无侵入实现批量接口反射执行能力
- 参数Fuzz异常构造能力
- 自动化测试用例控制真机执行用例和客户端异常恢复
- issue上报分析处理
文章图片
代码函数扫描 基于开源框架https://github.com/androguard...提供的apk扫描能力,可对某个支付宝版本apk生成全量的函数接口文件,目前Android和IOS端均可扫出大量函数接口数据进行测试。
客户端函数执行模块 使用支付宝动态bundle能力,可在不侵入支付宝客户端的情况下进行函数接口稳定性测试,测试过程分为以下几个阶段:
文章图片
1、扫描执行方式
由于全量的接口执行耗时过长,目前支持版本差异执行,通过计算大版本接口差异进行测试,可快速得到版本间差异接口的稳定性数据,同时支持特定bundle代码扫描,可针对某个业务方的代码执行扫描检测,将函数接口稳定性检测能力输出到业务方。
2、参数fuzz异常构造
参数异常构造是一个非常专业的课题,目前已经有大量基于机器学习的方案去构造异常数据覆盖更多代码逻辑,目前只是按照经验和业务语义构造了一组异常测试集,通过排列组合去遍历函数代码,目前1个接口根据参数个数可变异5-10个函数调用。从代码覆盖率结果看可以穿透60%接口的逻辑。
3、被测函数调用
被测函数调用过程主要解决的问题是执行效率,数据记录和断点续跑,执行效率依靠接口分组和多线程执行解决,函数执行过程严格分离保证结果可靠性。在接口扫雷测试过程中会出现大量的闪退和ANR卡死情况导致测试停止,为了自动完成整个测试过程,需要详细记录测试过程数据,捕获闪退时的关键数据保存并输出到客户端存储空间,为断点续跑提供关键数据。
4、闪退数据回放
执行完的测试用例有效保存到本地,程序支持直接回放异常用例验证代码修复后效果。
3 自动化脚本执行
自动化脚本的目的是唤起客户端执行测试用例,并且能够检测到客户端的异常情况,拉取测试数据确定断点位置,重新拉起客户端执行,保证整个测试流程可以完全自动化的执行无需人工干预。
总结与展望 支付宝客户端函数接口扫雷已经执行10多个大版本,双端累计发现近千条有效问题,并且在工具的迭代中持续降低问题误报率,提高Fuzz变异能力覆盖更多风险问题。同时函数接口扫雷的问题已经加入到客户端攻防演练中,作为真实闪退场景去攻击业务方。目前函数接口扫雷还有很多不完善的地方,像参数fuzz的智能变异构造,业务语义参数构造等还有待提高。未来还会继续补充客户端稳定性检测能力,力争将问题都在发版前解决。
【客户端稳定性异常检测(函数接口“扫雷”实践)】关注我们,每周 3 篇移动技术实践&干货给你思考!
推荐阅读
- python-安装sublime遇到异常
- Android|Android BLE蓝牙连接异常处理
- C#中类的异常处理详解
- thinkphp3.2下实现阿里云视频点播实例(客户端JavaScript上传)
- php异常处理
- 使用sqlalchemy|使用sqlalchemy orm 的model序列化,解决返回model的异常
- 20170323
- WebAPI|WebAPI 多对多对象输出json异常()
- 论工作的稳定性
- python深度学习实现自编码器Autoencoder神经网络异常检测心电图ECG时间序列