移动终端OS性能自动化测试技术研究与实现
2022-11-11向帮鑫杜贵锋陆薪行
向帮鑫 杜贵锋 陆薪行
(工业和信息化部电子第五研究所 广东省广州市 510000)
1 课题背景与研究意义
通信技术迅速发展,1G(第一代移动通信)、2G、3G、4G、5G技术持续快速迭代,并全面应用于生活、政务、金融、国防等领域。这为移动通信提供了良好的技术基础,移动终端设备紧随技术发展而推进,各类移动通信设备应运而生。无论对于促进经济市场良性发展,还是加强移动终端技术的自主性、安全性,移动终端的自动化测试技术研究是十分必要的。
终端产品性能的优劣会直接影响产品中应用的体验。通过测评可以直观的体现移动终端的性能强弱,并可查看整体和单项硬件的性能,通过结果判断各硬件的性能。对于终端内存优化、终端ROM鉴别都具有一定的参考价值。
据此,我们研究了一款“移动终端OS性能自动化测试系统”(以下简称“性能测试系统”),通过对移动终端的CPU、GPU、内存读写性能(ROM/RAM)、网络的吞吐量和吞吐率、关键接口的性能等各方面进行测试。通过测试结果,直观体现测试产品整体性能的关键指标。帮助消费者更好的理解与选择产品。此系统依托于本地化的数据存储,没有服务端参与数据交互,相比其他测试系统,保证了手机数据以及个人数据的私密性,也打消了用户关于本软件是否窃取隐私信息的顾虑。
2 移动终端测试技术研究
随着互联网与智能移动终端的快速发展,移动终端已经成为了最大的网络终端[1]。2021年度智能手机市场分析报告显示,2021年全球智能手机出货量达到13.5亿台,相较于2020年的12.7亿台,同比增长7%[2]。随着移动终端的使用量增加,其性能也成为了人们担心的问题,而移动终端测试技术的研究自然成为了其中的重点。
移动终端性能测试大多包含以下方面:CPU,将原有的原整数多线程运算能力、浮点多线程运算能力,整合优化为多核运算能力测试;原整数单线程运算能力、浮点单线程运算能力,整合优化为单核运算能力测试;CPU常用项目多维测试;硬件配置性能及ROM流畅性等等。
本文主要在移动终端性能测试方面进行研究,结合移动终端应用场景,设计实现基于移动终端本地化性能自动测试的研究。
3 测试模型设计实现
此次研究基于Android 11.0版本,向下兼容到4.2版本。以AndroidStudio[3]为开发平台,Android Fragment-Xpage[4]为页面框架,采用Java[5]语言进行设计实现。
实现移动终端自动化测试,需要对测试机进行基本配置信息提取,自动化测评,测评结果提取以及其它相关测试设置。自动化测评包括移动终端CPU、GPU、网络吞吐量和吞吐率、内存读写性能(ROM/RAM)、关键接口性能等方面。测试系统架构图如图1所示。
图1
3.1 配置信息调用实现
手机配置信息及基本信息的展示功能主要包括,手机品牌、手机型号、安卓版本、手机存储、屏幕大小、指纹信息六个模块。通过调用封装好的deviceinfo-0.1.5-source.jar源码库的部分接口来实现。该库根据继承BaseDeviceInfoCollector类,配合DeviceInfoManager以获取任意设备信息。通过DeviceInfoManager管理每个设备信息采集器。包含了device、battery、network、memery等信息。以上四个类可满足当前设计的需求。
通过创建一个Device对象获取设备信息。
Device device=new Device();
device.getManufacturer();
device.getModel();
device.getLanguage();
通过创建一个Network对象获取网络信息。
Network network=new Network();
network.getNetworkType();//网络类型
network.getNetworkClass();//网络状态
network.getOperator();//SIM卡
通过创建一个Memmory对象获取内存信息。
Memory memory = new Memory();
memory.getTotalRAM();//总内存
memory.getTotalInternalMemorySize();//总存储
memory.getAvailableInternalMemorySize();//可用存储
3.2 自动化测试技术
自动化测试模块的实现部分,包括CPU、GPU、接口、内存读写、吞吐率吞吐量。主要包含了系统的浮点运算、整型运算、能力和系统调用、编译器性能、文件读写速度等性能参数进行测试;系统进程处理能力、进程切换开销、文件处理能力和内存调度等方面进行测试;针对3G/4G/5G/Wi-Fi网络模式下网络速率和吞吐率进行测试;CPU占用率、内存占用率、GPU占用率进行测试,提供测试系统IO处 理能力;2D和3D图形应用程序接口API的测试;静态的和动态的资源的性能进行测试;用户的操作行为模拟和实时性能监测;不同压力类型下的整体性能分析;关键接口的响应时间测试。
3.2.1 关键模块算法设计
3.2.1 .1 CPU的算法设计与实现
CPU算法包括整型运算和浮点运算。二者在CPU运算中都很重要。日常的绝大多数应用都是整数计算为主的程序(会包含少量浮点指令),而只有科学计算程序会包含大量浮点代码。这个结论和常识并不符,但是经得起推敲。实际上可以用整数单元做的工作,编译器一般不会特地动用浮点单元。有时,一些高度数据结构要靠浮点单元来计算。整数运算和浮点运算往往体现在手机的流畅性。
(1)浮点运算算法设计。
根据经典的莱布尼茨级数[6]计算圆周率π的方式,模拟一个无线循环的小数点的计算,评估CPU浮点运算的能力。莱布尼茨级计算公式如下:
该公式也可记作:
莱布尼茨级数计算π的方式是:
π=S*4=3.141592654……
在以上公式中,n值(计算次数)如果足够大,运算次数越多,则计算的圆周率的值会越准确。其运算速度越快,则CPU的性能就越好。核心代码如下:
在测试系统中代码算法实现过程中,我将莱布尼茨公式的计算次数n定义了50000000次,当然这儿n值可随意定义,n值越大,要求的算力就越大。CPU在计算过程中会消耗掉一定的时间。将程序的n固定,可通过定量分析,计算其消耗的时间,从而评估出CPU的性能。
根据以上计算,如何直观的用分数体现CPU的性能,这儿主要还是依据时间的维度来评估。分数计算的核心代码如下:
long Stime= System.currentTimeMillis();
cpu2();//此处函数中调用了莱布尼茨计算的公式算法
long Etime= System.currentTimeMillis();
long time= Etime - Stime;
double score=100000-time;
zscore=(long) score;
在以上代码中,zscore为浮点运算的最终得分。先开始获取一个毫秒级别的时间Stime,在cpu2()函数中调用莱布尼茨计算公式算法的函数pi()。运行完pi()函数后,再取当前的毫秒时间Etime。两个时间相减,得到整个算法的运算时间time。用一个定量数100000减掉运算的时间,在多次运算后,可以使计算的分数更加精确。zscore则为浮点运算的分数。
(2)整数运算算法设计。
整数运算采用了多次计算无穷大数的算法。通过循环指数运算完成该算法。代码如下:
在以上代码中,定义了一个for循环和while循环。整体解释为:在循环计算1600000次2的999次方的基础上,将该计算再循环100次。
在for循环中套用一个while循环,目的是为了直线拉升计算的次数和量级,此处主要调用了Math.pow()函数进行计算。该庞大的计算过程为一个评估整数运算的过程。其消耗的时间也将作为一个评估CPU整数运算能力的一个单位。
分数计算代码如下:
long Stime1= System.currentTimeMillis();
runcpu();
long Etime1= System.currentTimeMillis();
long time1= Etime1- Stime1;
double c=100000- time1;
xscore=(long)c;
以上代码同样采用算法消耗的时间来评估分数,计算整数运算分数的原理和浮点运算的分数原理是一样的。3.2.1.2 文件读写性能算法设计
内存卡的读写速度是指内存卡的传输速率。不同的内存卡有不同的速度等级,一般情况下速度等级越高传输速度越快。SD2.0规范中对于SD卡的性能上分为4个等级。分别是:
0:包括低于Class2和未标注SpeedClass的情况,
2:传输速率至少2MB/s,最大约6MB/s,
4:传输速率至少4MB/s,最大约10MB/s,
6:传输速率至少6MB/s,最大约20MB/s。
(1)写文件算法设计。
写文件的算法首先定义了一个200兆固定值大小的文件。通过写入200兆文件的时间。评估出手机写入文件的性能。核心代码如下:
以上写文件代码定义了一个200兆大小的文件进行写入,通过循环写入字节的方式完成。该文件的写入需要用户在运行该测试程序前同意写入的操作权限请求,文件写入的位置为/storage/emulated/0/paofen/paofen。在测评完成后,会自动删除。不会对系统造成任何影响。这儿的文件大小可以自由设置。文件越大,计算的时间就越精确。
计算得分的代码如下:
double Stime= System.currentTimeMillis();createFile(filepa th+"testfile",200);
double Etime= System.currentTimeMillis();
double runningtime1=Endtime-Starttime; wtspeed=200/(runningtime1/200);
String xrdot= Double(wtspeed)+"MB/s";long zspeed=(long) Math.pow(result,2.5);
根据写文件算法的执行时间,计算出每秒可写入文件的速率wtspeed。得出最后的分数zspeed。
(2)读文件算法设计。
读取文件的位置与文件算法生成的文件位置是一样的。通过创建输入流和输出流,按照字节大小的粒度进行读取。根据读取消耗的时间评估结果。
以上代码在运算完成读取文件的算法后会消耗一定的时间,此处的读取文件的大小和写文件的大小一致,主要是为了保证读写文件时间的计算计算精确度,以及程序运行完后垃圾文件的处理方便。
(3)得分计算的代码如下:
long Stime= System.currentTimeMillis();
saveImage(filepath+"testfile");
long Etime= System.currentTimeMillis();
longrunningtime2=endtime-starttime;
dqspeed=200/(runningtime2/200);
long hspeed=(long) Math.pow(result,
2.5)
根据读取文件算法的执行时间,计算出每秒读取入文件的速率dqspeed。得出最后的分数hspeed。
(4)其他算法设计介绍。
在GPU调用、接口读写、网络吞吐率的测试中。同样是在毫秒级别时间的维度进行测试,根据定量分析的思路,计算出合理的分数。例如关键接口的调用,调用一次的时间无法估算出性能,所以通过指数级别次数的调用过程中,产生的时间则能精确计算出性能的优劣。网络吞吐率主要是通过远程下载和上传固定大小的文件,来评估手机网络吞吐率的性能。
3.3 其他功能-设置
其他重要的功能在设置模块,主要有测评记录、清除测评记录。
测评记录数据存储在本地,主要是为了避免个人用户担心此类跑分软件会不会窃取手机内个人隐私数据到服务器的顾虑。数据存储本地化的设计的原因有两个。第一,简化数据的处理,直接存储在本地避免了与服务端进行通信,简化了数据处理流程,节约了服务器的成本。第二,打消用户对个人隐私数据的顾虑。
功能设计主要代码如下:
以上代码中,在跑分完全结束后,会在/storage/emulated/0/paofen/paofen通过writeTxt函数创建一个文件,将数据作为txt,直接存储在文件里。readFileContent读取文件展示在页面里。
此外,为了提升系统运行的体验,设置了数据清除的功能。在设置中点击清除跑分记录,则全部清除历史数据。
代码如下:
3.4 测评结果
点击手机主页“一键测评”,在该自动化程序运行完成后,测评结果先会通过弹框的形式展示出来。可以清晰的展示出该手机的所有性能。
在测试实验测试阶段,经过多款常用的手机,多次的性能测试后。得出的结果如表1所示。
表1:性能测试结果(注:此排名仅供参考)
4 结论
在移动终端OS性能自动化测试系统整个开发过程中,通过对Adnroid开发技术的学习以及手机系统功能的研究,确定了使用Android Fragment页面框架-Xpage,以及非远程存储数据的设计方案。严格按照前期的需求设计与需求说明,进行架构的搭建与开发,然后进行了整个系统的编码开发工作,最后通过对系统的测试及调优,完成了整体的工作。
通过对多款手机的测试,基本上实现了移动终端OS性能自动化测试系统预期的设计目标与初衷,使用该测评系统能够完整的对手机的性能进行全面的测评,并得出测评结果,用户在使用体验中,对系统有比较好的认可和良好的反馈。