官方首发 阿里巴巴技术质量:Android 性能测试工具 mobileperf 开源 (天猫精灵 Android 性能测试-线下篇)
Android性能测试工具mobileperf github 如果您觉得有帮助,请给个star,有问题欢迎加入文底钉钉群交流
背景
露客 2018年加入天猫精灵,之前有过一些性能 稳定性测试经验,但天猫精灵跟我之前的项目经验不太一样,之前大多服务于单独的APP,比如测手淘就只是测手淘,而天猫精灵业务更复杂一些,主要有如下挑战:
1、除了天猫精灵手机APP,还有带屏天猫精灵上很多APP都需要支持,比如天猫精灵CC上有13个app,每个app使用场景各有不同,涵盖了通讯录、视频、音乐、购物等各种场景
2、相比手机app,除了点击操作的触屏链路,天猫精灵还有语音链路
3、手机app monkey test一般可能也就云测平台上跑几个小时,语音压测需要连续测试72个小时以上,测试时长远超云测工具,对工具的稳定性提出了新的要求
4、相对现在定价动辄几千块,均价2千左右的手机,天猫精灵定价只有几百,硬件配置差些,所遇到的性能 稳定性挑战会更严峻
需求
本着前期先能发现问题,再深入定位问题,所以确定了线下、线上分步走的策略
1、线下方案,能方便采集性能数据,工具要支持Android手机、天猫精灵各种Android定制设备,支持Android全版本,轻量化,使用低门槛,尽可能少侵入甚至零侵入设备
2、线上性能指标 问题定位
本文是Android线下篇
线下方案选型
工具选型
- Android App
劣势:Android低版本有些功能需要root,Android高版本跨进程获取数据,权限限制,不兼容
- PC adb工具
优势:非侵入,权限高,能发现问题
劣势:需要连接数据线,便携性差点
- SDK
劣势:侵入式,需集成SDK,不利于做竞品测试
GT github上已表示Android GT后续不再支持GT APP版本,只支持GT SDK
由于Android权限控制越来越严格,通过APP跨进程获取性能数据在Android高版本已越来越困难,由于adb shell权限比较高,相信Android会一直开放开发者权限,故方案选型阶段,采用了依赖adb的方案,开发了一套Android性能数据采集工具mobileperf
还有一种思路,仍然是app形态,但用了adb wifi通道,露客之前也有过一些测试工具app的经验,相比采用adb usb方式mobileperf的担忧:
- 测试工具app,应用进程优先级,还是会受Android限制,担心系统资源不足,测试进程优先级不高,被系统kill概率大,在IOT低端设备上被kill概率更大,进程保活是业界难题,黑科技手段层出不穷,并且存在随时被官方封杀的风险,路只会越走越窄,mobileperf是PC程序,除非adb usb方式不能用了,设备失联,关机等恶劣情况,都OK,与其花费很大精力探索各种黑科技上,还不如把精力放在Android允许范围内倒腾
- 带屏天猫精灵都是定制Android系统,测试工具app可能要做单独的适配,兼容性成本高点,这点mobileperf不用担心,只要是Android系统、adb能用就可以,在各种Android定制设备,使用成本更低
- 由于是APP,系统需要单独分配资源,比如工具发现的anr,开发童鞋一看cpu占用信息,如果发现测试工具app占用cpu较高,就很容易受到挑战,找工具的锅(不排除有些ANR确实是工具导致的),而mobileperf采集都依赖系统命令,这种影响小些
- 长时间测试,比如72小时以上,adb wifi担心会有点不稳定,毕竟要依赖网络
工具对比
mobileperf跟GT APP对比如下
架构
工具自身影响
mobileperf对PC的影响
测试PC:MacBook Pro (Retina,15-inch, Mid 2015) 2.2 GHz 四核Intel Core i7
工具稳定性:mobileperf能支持跑72个小时以上,adb断开重连都能继续采集
工具适用性:支持mac linux windows平台
工具Android兼容性验证
phone model | Android version | result |
HUAWEI Mate20 HMA-AL00 | 10 | pass |
HUAWEI Mate20 HMA-AL00 | 9 | pass |
HUAWEI Mate10 ALP-TL00 | 9 | pass |
HUAWEI Mate9 MHA-AL00 | 9 | pass |
HUAWEI P10 Plus | 9 | pass |
HUAWEI Honor AL10 | 9 | pass |
samsung Note9 SM-N9600 | 8.1.0 | pass |
Oppo R15 PACM00 | 8.1.0 | pass |
VIVO X23 | 8.1.0 | pass |
XiaoMi Note3 | 8.1.0 | pass |
RedMi note5 | 8.1.0 | pass |
Xiaomi MI 5 | 8.0.0 | pass |
smartisan OD103 | 7.1.1 | pass |
HUAWEI TRT-AL00 | 7.0 | pass |
vivo Y66 | 6.0.1 | pass |
XiaoMi Mi2 | 5.0.2 | pass |
效果
mobileperf在项目中使用1年半,天猫精灵总共发现了性能 稳定性类问题几百个,bug解决率都是100%
采集原理
cpu
方案调研
1、dumpsys cpuinfo
2、top命令
3、通过proc/stat计算cpu使用率
两者区别:Android CPU使用率:top和dump cpuinfo的不同,看网上一番讨论,top更准
通过实验发现采集频率非常快时,top有点耗cpu,对手机本身性能有影响,自测,采集频率1s,top在低端手机上(红米)会占到7%(100%统计方式)的cpu使用率,天猫精灵采集频率5s,会有20%占用(400%统计方式),发现top的底层实现是读取proc文件,top对每个进程都有计算
网上提供了一种计算方式,原理上跟top一样,如果计算指定进程的cpu使用率,只需读对应的proc文件,通过jiffies计算就可以了,这样比top方式占用cpu低,计算方式如下
整机cpu使用率
通过读取/proc/stat ,这个文件包含了所有cpu核的汇总情况,所以后面计算不用考虑核数,占用率不会超过100%
cpu使用时间 = user+nice+system+iowait+irq+softirq
CPU总时间=user+nice+system+idle+iowait+irq+softirq = cpu使用时间 +cpu idle时间
总cpu使用率=(cpu使用时间2-cpu使用时间1)/(cpu总时间2-cpu总时间1)*100%
进程cpu使用率
通过读取/proc/pid/stat
进程cpu使用时间 = utime+stime
进程cpu使用率=(进程cpu使用时间2-进程cpu使用时间1)/(cpu总时间2-cpu总时间1)*100%
选定方案
采集时间间隔 ,配置文件中默认5秒,由于对采集频率要求不高,top支持同时采集多进程,结果简单易处理,实时性 可信度高,决定采用top的方式
测试过程中会生成cpuinfo.csv,可以测试过程中查看,表中各列解释
汇总xlsx文件会在测试结束后生成,xlsx数据跟csv数据完全一致,xlsx汇总是根据csv的数据画的曲线(csv没有画图功能)
内存
整机内存 可用内存通过dumpsys meminfo获取 Total RAM 、Free RAM
各进程pss通过dumpsys meminfo package获取TOTAL行 Pss Total所在列的值,各进程PSS也可以通过dumpsys meminfo获取,只是拿不到各进程更详细的内存占比情况,比如堆大小、native、system、so大小等
经在CC上测试发现dumpsys meminfo比dumpsy meminfo package耗时长,dumpsys meminfo耗时6s多,dumpsys meminfo package能在一秒内完成,采集频率5s,dumpsy meminfo会导致CC上system_server系统进程cpu由2%增高到80%,所以降低了dumpsys meminfo采集频率,采用10倍设置频率采集(比如 dumpsys meminfo package 5s,dumpsy meminfo则50s)
由于要支持多进程的情况,现在各进程pss通过解析dumpsys meminfo结果得到,dumpsys meminfo package来获取各个进程的详细内存情况
在测试过程中会生成一个meminfo.csv文件,可以查看,表中各列解释
这个csv表格是用dumpsys meminfo得出的,汇总xlsx文件会在测试结束后生成,对应meminfo这个表格
每个进程会有pss_部分包名的csv表格,这个表格是用dumpsys meminfo package得出的
能把每个进程的详细内存展示出来
汇总xlsx中对应pss_部分包名这个表格
如果进程发生了内存泄露,根据曲线,很方便一眼就看出是哪部分导致泄漏
为了帮助定位内存泄漏问题,工具每隔一个小时会执行am dumpheap package ,dump进程内存,但不能像LeakCanary直接翻译出GC引用链,仍需人工分析下
流畅度(fps/丢帧)
fps通过dumpsys SurfaceFlinger或dumpsys gfxinfo(android8.0之后)获得最近128帧数据计算得出,fps=帧数/耗费时间
如果以上两种方式都不OK,机器有root,用service call SurfaceFlinger 1013获取帧数
通过dumpsys SurfaceFlinger的方式还会计算丢帧janky值
丢帧:相邻两次绘制之间的丢帧数,丢帧数越多,说明问题越严重,mobileperf默认丢帧数超过10帧算是严重丢帧
流畅度数据在fps.csv中
表中各列解释
页面打开耗时
mobileperf从logcat日志中抓取am_activity_fully_drawn_time和am_activity_launch_time(大多数情况)日志,
会生成launch_logcat.csv
不过这种方式有个弊端,日志的耗时不能完全反馈真实的体验耗时,我们内部已有其他方案测试启动耗时
monkey(可限制activity)
mobileperf调用了Android原生的monkey,如果您想限制在指定内activity内跑monkey ,可以通过配置项,开启monkey 后,会在测试目录下生成monkey.log
#如果需要在限定activity内做monkey test,main_activity是模块的几个主入口,用分号; 分隔 #main_activity=com.alibaba.ailabs.genie.contacts.MainActivity #activity_list是准许的activity,main_activity开启前提下有效 activity_list=com.alibaba.ailabs.genie.contacts.MainActivity; com.alibaba.ailabs.genie.contacts.cmd.CmdDispatchActivity; com.alibaba.ailabs.genie.contacts.cmd.transform.VoipToPstnActivity; com.alibaba.ailabs.genie.contacts.add.AddContactsActivity; com.alibaba.ailabs.genie.contacts.avatar.TakePhotoActivity; com.alibaba.ailabs.genie.contacts.details.DetailsActivity; com.alibaba.ailabs.genie.contacts.add.RelationshipActivity; com.alibaba.ailabs.genie.contacts.details.DownloadTipsActivity; com.alibaba.ailabs.genie.contacts.details.DownloadTipsMiniActivity; com.alibaba.ailabs.genie.contacts.cmd.selectlist.call.VCallListActivity; com.alibaba.ailabs.genie.contacts.cmd.selectlist.contacts.VContactListActivity; com.alibaba.ailabs.genie.contacts.message.VoiceDetailsActivity
logcat日志(支持异常日志检测)
工具会保留全量logcat日志,每隔60万行会新建文件,辅助定位问题
如果配置文件中配置了异常日志
会将logcat中出现的异常日志都保存在exception.log中
根据异常汇总日志,再去logcat日志查看详细上下文信息,可以快速定位问题
流量
通过读取/proc/net/xt_qtaguid/stats文件获取,因为Android提供的流量统计API – TrafficStats中,对uid进行流量统计的方法,能区分应用,底层就是读取了该文件
流量数据在traffics_uid.csv中,表中各列解释
电量
先通过dumpsys batteryproperties获取,如果获取不到,再通过dumpsys battery获取(Android9)
问题:插着usb,这两种方式获取到的并不精准,并非专业级电流电量测试,只能作为参考
电量数据在powerinfo.csv中,表中各列解释
由于功耗软件测试方式不太精准,我们内部已用硬件方案测试功耗,此项mobileperf中默认关闭
常驻进程pid监控
天猫精灵是整机,跟很多手机app不一样,是应用级别app,可能会被用户手动kill掉,天猫精灵上有些系统优先级进程,不能挂掉,一旦挂掉,会导致无法使用,所以mobileperf新增了常驻进程pid监控,一旦pid发生了变化,认为发生了异常
#常驻进程,需要关注pid变化,多个进程,英文分号分隔 pid_change_focus_package=com.alibaba.ailabs.genie.smartapp;com.alibaba.ailabs.genie.smartapp:core
磁盘剩余空间检查
天猫精灵跟很多手机app不一样,随便压测就是3天以上,如果有写文件不正常,占满磁盘空间,会导致机器彻底无法使用,影响用户体验,所以测试结束时,添加了对磁盘剩余空间检查,如果使用空间超过80%,则自动提单
进程线程数
通过进程名获取pid,ls -lt /proc/pid/task,统计多少行数即线程数