爱测未来移动-再谈Android数据监控_iTest优化解密

来源:互联网 发布:企业淘宝开店费用 编辑:程序博客网 时间:2024/05/14 18:00

上文《从Emmagee代码浅谈Android基础性能数据监控方法》介绍的是很通用的一些方法介绍,我们的iTest工具前期几乎是完全基于类似的方法,但是在实践过程中,我们遇到过很多坑,也收到很多粉丝提出的新场景需求,为了填坑和能够满足更多的场景,我们在很多实现上做了优化,也形成了我们自己的一些特色功能,这里先聊一聊一些优化实践吧。


1. NDK实现

随着手机的更新换代,硬件性能和配置越来越高,有人会说内存、CPU那都不是事,其实在高配手机上,确实没啥关系;但是也不能忽视一点:始终却有部分人还在用内存1G甚至是512M的手机(设备);作为测试人员的我们,肯定在用户统计平台研究过我们的App用户的终端数据,相信大多数情况下大家的结论应该差不多吧。正是因为这样,我们的iTest也收到了一种诉求:我们设备配置低,iTest运行本身会不会影响被测App的运行,能不能降低iTest本身的资源消耗呢?也正是基于这种诉求,我们开启了iTest本身的性能优化之旅,也顺理成章的想到了NDK

考虑到大多数的数据都是从文件获取、解析而来,NDK也可以实现,众所周知CJava效率更高一些,虽然我们知道JNI调用及数据传递存在一定的开销,抱着试一试的态度将相关数据获取均采用NDK方式实现,实现后与Java方案对比,对比发现采用NDK方案后,虽然CPU占用和之前基本持平,但是获取数据消耗时间却提升了一个数量级。这里也给出我们的对比测试结果,Java方案获取单项指标均值在57ms左右,而NDK获取单项指标均值只需要0.20.4ms,也正是基于这个优化结果,我们在4.0.0版本上正式使用了NDK方案。

       需要说明的是,针对直接使用Android系统API获取的部分数据,我们对比发现并没有优化的空间,所以这部分还是沿用之前介绍的Java实现。


2. 数据可信度

经常会看到某监控工具的CPU值出现负值、出现大于100%的值。这其实就是这里提到的数据可信度的一个概念。

从上文介绍进程CPU获取的时候,不难看出获取某进程的1CPU数据需要读取4次文件,分别是:A时刻的/proc/${pid}/stat/proc/statB时刻的/proc/${pid}/stat/proc/stat。其实读取文件的快慢会很大程度上影响数据的有效性。比如1s间隔获取CPU时,读取/proc/${pid}/stat文件消耗了500ms,那么这次数据其实很大程度上就受到了影响,那么这次获取的CPU数据可信度就很差了。我们假定读取一次/proc/${pid}/stat/proc/stat为一组,读取1组超过50ms的即认为数据可信度较差,会在数据后面增加unreliable标志,当我们的CPU数据后面有这个标志,那通常是设备本身的CPU或者其他资源相对饱和了。

此外,当数据读取出现某种异常时,我们会重试,最大重试3次;针对数据会大于100%的情况,我们采取一种策略:就是A时刻的时候先读取/proc/statB时刻的时候后读取/proc/stat,这样可以减少分子大于分母的情况;iTest里有一个错误码的概念,当看到出现负值的时候不要困惑,请查看errorCode.txt找到错误的原因。


3. PID获取

上文介绍的PID获取方法是通过Android ActivityManagergetRunningAppProcesses方法,但是这种方式并不能解决linux进程的数据获取,也不能自动找到属于App的所有进程,还不能只监控某App(多进程)的其中一个或多个进程。为了解决这样的问题,我们采用一种改进的方案:首先通过筛选ps命令中的user信息找到监控App的所有进程PID,再通过读取事先设置好的配置文件来筛选出真正要监控的进程。psuser信息命令如图1所示,ps各字段含义如图2所示,需要用到的分别是USERPIDPPIDNAME,图4中的u0_a111其实也代表着AppUIDu0_a111对应的UID10111,对于非App应用,USER就是system之类,如图3所示。


图1 App进程ps实例


2 ps字段


App进程ps实例


4. 命令行方式

值得一提的是,我们的iTest针对开始监控、停止监控、场景模拟等主要功能都提供了命令行支持,主要是通过Android的广播BroadcastReciver实现,虽然实现起来不难,但是用途确实不小,有了这种命令行启动方式,就可以很好的满足自动化测试的场景;另外,对于一些界面兼容性不太好或者没有界面的场景,比如车机、Pad、电视等Android设备上,通过命令行可以完美解决这一类的使用需求。


5. 结束语

经过上面的介绍,相信大家对iTest的了解又更进一步了,后面我们有机会再一起看看iTest那些鲜为人知的功能。


公众号:itest_forever



CSDN:http://blog.csdn.net/itest_2016

QQ群:274166295(爱测未来2群)、610934609(爱测未来3群)


原创粉丝点击