客户端稳定性异常检测:函数接口“扫雷”实践
作者:安晴
背景
在过去的财年中,支付宝客户端高可用团队持续保障着支付宝客户端线上的高可用稳定性,但只有线上的应急快反能力是不够的,还需要线下提前发现客户端的稳定性风险建设风险挖掘能力,完善整体的客户端高可用保障体系。通过总结过去 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/androguard提供的 apk 扫描能力,可对某个支付宝版本 apk 生成全量的函数接口文件,目前 Android 和 IOS 端均可扫出大量函数接口数据进行测试。
客户端函数执行模块
使用支付宝动态 bundle 能力,可在不侵入支付宝客户端的情况下进行函数接口稳定性测试,测试过程分为以下几个阶段:
1、扫描执行方式
由于全量的接口执行耗时过长,目前支持版本差异执行,通过计算大版本接口差异进行测试,可快速得到版本间差异接口的稳定性数据,同时支持特定 bundle 代码扫描,可针对某个业务方的代码执行扫描检测,将函数接口稳定性检测能力输出到业务方。
2、参数 fuzz 异常构造
参数异常构造是一个非常专业的课题,目前已经有大量基于机器学习的方案去构造异常数据覆盖更多代码逻辑,目前只是按照经验和业务语义构造了一组异常测试集,通过排列组合去遍历函数代码,目前 1 个接口根据参数个数可变异 5-10 个函数调用。从代码覆盖率结果看可以穿透 60%接口的逻辑。
3、被测函数调用
被测函数调用过程主要解决的问题是执行效率,数据记录和断点续跑,执行效率依靠接口分组和多线程执行解决,函数执行过程严格分离保证结果可靠性。在接口扫雷测试过程中会出现大量的闪退和 ANR 卡死情况导致测试停止,为了自动完成整个测试过程,需要详细记录测试过程数据,捕获闪退时的关键数据保存并输出到客户端存储空间,为断点续跑提供关键数据。
4、闪退数据回放
执行完的测试用例有效保存到本地,程序支持直接回放异常用例验证代码修复后效果。
3 自动化脚本执行
自动化脚本的目的是唤起客户端执行测试用例,并且能够检测到客户端的异常情况,拉取测试数据确定断点位置,重新拉起客户端执行,保证整个测试流程可以完全自动化的执行无需人工干预。
总结与展望
支付宝客户端函数接口扫雷已经执行 10 多个大版本,双端累计发现近千条有效问题,并且在工具的迭代中持续降低问题误报率,提高 Fuzz 变异能力覆盖更多风险问题。同时函数接口扫雷的问题已经加入到客户端攻防演练中,作为真实闪退场景去攻击业务方。目前函数接口扫雷还有很多不完善的地方,像参数 fuzz 的智能变异构造,业务语义参数构造等还有待提高。未来还会继续补充客户端稳定性检测能力,力争将问题都在发版前解决。
关注我们,每周 3 篇移动技术实践 &干货给你思考!
版权声明: 本文为 InfoQ 作者【阿里巴巴移动技术】的原创文章。
原文链接:【http://xie.infoq.cn/article/575f82079b54f5c08d7e638a6】。文章转载请联系作者。
评论