向幫鑫 杜貴鋒 陸薪行
(工業(yè)和信息化部電子第五研究所 廣東省廣州市 510000)
通信技術(shù)迅速發(fā)展,1G(第一代移動(dòng)通信)、2G、3G、4G、5G技術(shù)持續(xù)快速迭代,并全面應(yīng)用于生活、政務(wù)、金融、國(guó)防等領(lǐng)域。這為移動(dòng)通信提供了良好的技術(shù)基礎(chǔ),移動(dòng)終端設(shè)備緊隨技術(shù)發(fā)展而推進(jìn),各類移動(dòng)通信設(shè)備應(yīng)運(yùn)而生。無論對(duì)于促進(jìn)經(jīng)濟(jì)市場(chǎng)良性發(fā)展,還是加強(qiáng)移動(dòng)終端技術(shù)的自主性、安全性,移動(dòng)終端的自動(dòng)化測(cè)試技術(shù)研究是十分必要的。
終端產(chǎn)品性能的優(yōu)劣會(huì)直接影響產(chǎn)品中應(yīng)用的體驗(yàn)。通過測(cè)評(píng)可以直觀的體現(xiàn)移動(dòng)終端的性能強(qiáng)弱,并可查看整體和單項(xiàng)硬件的性能,通過結(jié)果判斷各硬件的性能。對(duì)于終端內(nèi)存優(yōu)化、終端ROM鑒別都具有一定的參考價(jià)值。
據(jù)此,我們研究了一款“移動(dòng)終端OS性能自動(dòng)化測(cè)試系統(tǒng)”(以下簡(jiǎn)稱“性能測(cè)試系統(tǒng)”),通過對(duì)移動(dòng)終端的CPU、GPU、內(nèi)存讀寫性能(ROM/RAM)、網(wǎng)絡(luò)的吞吐量和吞吐率、關(guān)鍵接口的性能等各方面進(jìn)行測(cè)試。通過測(cè)試結(jié)果,直觀體現(xiàn)測(cè)試產(chǎn)品整體性能的關(guān)鍵指標(biāo)。幫助消費(fèi)者更好的理解與選擇產(chǎn)品。此系統(tǒng)依托于本地化的數(shù)據(jù)存儲(chǔ),沒有服務(wù)端參與數(shù)據(jù)交互,相比其他測(cè)試系統(tǒng),保證了手機(jī)數(shù)據(jù)以及個(gè)人數(shù)據(jù)的私密性,也打消了用戶關(guān)于本軟件是否竊取隱私信息的顧慮。
隨著互聯(lián)網(wǎng)與智能移動(dòng)終端的快速發(fā)展,移動(dòng)終端已經(jīng)成為了最大的網(wǎng)絡(luò)終端[1]。2021年度智能手機(jī)市場(chǎng)分析報(bào)告顯示,2021年全球智能手機(jī)出貨量達(dá)到13.5億臺(tái),相較于2020年的12.7億臺(tái),同比增長(zhǎng)7%[2]。隨著移動(dòng)終端的使用量增加,其性能也成為了人們擔(dān)心的問題,而移動(dòng)終端測(cè)試技術(shù)的研究自然成為了其中的重點(diǎn)。
移動(dòng)終端性能測(cè)試大多包含以下方面:CPU,將原有的原整數(shù)多線程運(yùn)算能力、浮點(diǎn)多線程運(yùn)算能力,整合優(yōu)化為多核運(yùn)算能力測(cè)試;原整數(shù)單線程運(yùn)算能力、浮點(diǎn)單線程運(yùn)算能力,整合優(yōu)化為單核運(yùn)算能力測(cè)試;CPU常用項(xiàng)目多維測(cè)試;硬件配置性能及ROM流暢性等等。
本文主要在移動(dòng)終端性能測(cè)試方面進(jìn)行研究,結(jié)合移動(dòng)終端應(yīng)用場(chǎng)景,設(shè)計(jì)實(shí)現(xiàn)基于移動(dòng)終端本地化性能自動(dòng)測(cè)試的研究。
此次研究基于Android 11.0版本,向下兼容到4.2版本。以AndroidStudio[3]為開發(fā)平臺(tái),Android Fragment-Xpage[4]為頁(yè)面框架,采用Java[5]語(yǔ)言進(jìn)行設(shè)計(jì)實(shí)現(xiàn)。
實(shí)現(xiàn)移動(dòng)終端自動(dòng)化測(cè)試,需要對(duì)測(cè)試機(jī)進(jìn)行基本配置信息提取,自動(dòng)化測(cè)評(píng),測(cè)評(píng)結(jié)果提取以及其它相關(guān)測(cè)試設(shè)置。自動(dòng)化測(cè)評(píng)包括移動(dòng)終端CPU、GPU、網(wǎng)絡(luò)吞吐量和吞吐率、內(nèi)存讀寫性能(ROM/RAM)、關(guān)鍵接口性能等方面。測(cè)試系統(tǒng)架構(gòu)圖如圖1所示。
圖1
手機(jī)配置信息及基本信息的展示功能主要包括,手機(jī)品牌、手機(jī)型號(hào)、安卓版本、手機(jī)存儲(chǔ)、屏幕大小、指紋信息六個(gè)模塊。通過調(diào)用封裝好的deviceinfo-0.1.5-source.jar源碼庫(kù)的部分接口來實(shí)現(xiàn)。該庫(kù)根據(jù)繼承BaseDeviceInfoCollector類,配合DeviceInfoManager以獲取任意設(shè)備信息。通過DeviceInfoManager管理每個(gè)設(shè)備信息采集器。包含了device、battery、network、memery等信息。以上四個(gè)類可滿足當(dāng)前設(shè)計(jì)的需求。
通過創(chuàng)建一個(gè)Device對(duì)象獲取設(shè)備信息。
Device device=new Device();
device.getManufacturer();
device.getModel();
device.getLanguage();
通過創(chuàng)建一個(gè)Network對(duì)象獲取網(wǎng)絡(luò)信息。
Network network=new Network();
network.getNetworkType();//網(wǎng)絡(luò)類型
network.getNetworkClass();//網(wǎng)絡(luò)狀態(tài)
network.getOperator();//SIM卡
通過創(chuàng)建一個(gè)Memmory對(duì)象獲取內(nèi)存信息。
Memory memory = new Memory();
memory.getTotalRAM();//總內(nèi)存
memory.getTotalInternalMemorySize();//總存儲(chǔ)
memory.getAvailableInternalMemorySize();//可用存儲(chǔ)
自動(dòng)化測(cè)試模塊的實(shí)現(xiàn)部分,包括CPU、GPU、接口、內(nèi)存讀寫、吞吐率吞吐量。主要包含了系統(tǒng)的浮點(diǎn)運(yùn)算、整型運(yùn)算、能力和系統(tǒng)調(diào)用、編譯器性能、文件讀寫速度等性能參數(shù)進(jìn)行測(cè)試;系統(tǒng)進(jìn)程處理能力、進(jìn)程切換開銷、文件處理能力和內(nèi)存調(diào)度等方面進(jìn)行測(cè)試;針對(duì)3G/4G/5G/Wi-Fi網(wǎng)絡(luò)模式下網(wǎng)絡(luò)速率和吞吐率進(jìn)行測(cè)試;CPU占用率、內(nèi)存占用率、GPU占用率進(jìn)行測(cè)試,提供測(cè)試系統(tǒng)IO處 理能力;2D和3D圖形應(yīng)用程序接口API的測(cè)試;靜態(tài)的和動(dòng)態(tài)的資源的性能進(jìn)行測(cè)試;用戶的操作行為模擬和實(shí)時(shí)性能監(jiān)測(cè);不同壓力類型下的整體性能分析;關(guān)鍵接口的響應(yīng)時(shí)間測(cè)試。
3.2.1 關(guān)鍵模塊算法設(shè)計(jì)
3.2.1 .1 CPU的算法設(shè)計(jì)與實(shí)現(xiàn)
CPU算法包括整型運(yùn)算和浮點(diǎn)運(yùn)算。二者在CPU運(yùn)算中都很重要。日常的絕大多數(shù)應(yīng)用都是整數(shù)計(jì)算為主的程序(會(huì)包含少量浮點(diǎn)指令),而只有科學(xué)計(jì)算程序會(huì)包含大量浮點(diǎn)代碼。這個(gè)結(jié)論和常識(shí)并不符,但是經(jīng)得起推敲。實(shí)際上可以用整數(shù)單元做的工作,編譯器一般不會(huì)特地動(dòng)用浮點(diǎn)單元。有時(shí),一些高度數(shù)據(jù)結(jié)構(gòu)要靠浮點(diǎn)單元來計(jì)算。整數(shù)運(yùn)算和浮點(diǎn)運(yùn)算往往體現(xiàn)在手機(jī)的流暢性。
(1)浮點(diǎn)運(yùn)算算法設(shè)計(jì)。
根據(jù)經(jīng)典的萊布尼茨級(jí)數(shù)[6]計(jì)算圓周率π的方式,模擬一個(gè)無線循環(huán)的小數(shù)點(diǎn)的計(jì)算,評(píng)估CPU浮點(diǎn)運(yùn)算的能力。萊布尼茨級(jí)計(jì)算公式如下:
該公式也可記作:
萊布尼茨級(jí)數(shù)計(jì)算π的方式是:
π=S*4=3.141592654……
在以上公式中,n值(計(jì)算次數(shù))如果足夠大,運(yùn)算次數(shù)越多,則計(jì)算的圓周率的值會(huì)越準(zhǔn)確。其運(yùn)算速度越快,則CPU的性能就越好。核心代碼如下:
在測(cè)試系統(tǒng)中代碼算法實(shí)現(xiàn)過程中,我將萊布尼茨公式的計(jì)算次數(shù)n定義了50000000次,當(dāng)然這兒n值可隨意定義,n值越大,要求的算力就越大。CPU在計(jì)算過程中會(huì)消耗掉一定的時(shí)間。將程序的n固定,可通過定量分析,計(jì)算其消耗的時(shí)間,從而評(píng)估出CPU的性能。
根據(jù)以上計(jì)算,如何直觀的用分?jǐn)?shù)體現(xiàn)CPU的性能,這兒主要還是依據(jù)時(shí)間的維度來評(píng)估。分?jǐn)?shù)計(jì)算的核心代碼如下:
long Stime= System.currentTimeMillis();
cpu2();//此處函數(shù)中調(diào)用了萊布尼茨計(jì)算的公式算法
long Etime= System.currentTimeMillis();
long time= Etime - Stime;
double score=100000-time;
zscore=(long) score;
在以上代碼中,zscore為浮點(diǎn)運(yùn)算的最終得分。先開始獲取一個(gè)毫秒級(jí)別的時(shí)間Stime,在cpu2()函數(shù)中調(diào)用萊布尼茨計(jì)算公式算法的函數(shù)pi()。運(yùn)行完pi()函數(shù)后,再取當(dāng)前的毫秒時(shí)間Etime。兩個(gè)時(shí)間相減,得到整個(gè)算法的運(yùn)算時(shí)間time。用一個(gè)定量數(shù)100000減掉運(yùn)算的時(shí)間,在多次運(yùn)算后,可以使計(jì)算的分?jǐn)?shù)更加精確。zscore則為浮點(diǎn)運(yùn)算的分?jǐn)?shù)。
(2)整數(shù)運(yùn)算算法設(shè)計(jì)。
整數(shù)運(yùn)算采用了多次計(jì)算無窮大數(shù)的算法。通過循環(huán)指數(shù)運(yùn)算完成該算法。代碼如下:
在以上代碼中,定義了一個(gè)for循環(huán)和while循環(huán)。整體解釋為:在循環(huán)計(jì)算1600000次2的999次方的基礎(chǔ)上,將該計(jì)算再循環(huán)100次。
在for循環(huán)中套用一個(gè)while循環(huán),目的是為了直線拉升計(jì)算的次數(shù)和量級(jí),此處主要調(diào)用了Math.pow()函數(shù)進(jìn)行計(jì)算。該龐大的計(jì)算過程為一個(gè)評(píng)估整數(shù)運(yùn)算的過程。其消耗的時(shí)間也將作為一個(gè)評(píng)估CPU整數(shù)運(yùn)算能力的一個(gè)單位。
分?jǐn)?shù)計(jì)算代碼如下:
long Stime1= System.currentTimeMillis();
runcpu();
long Etime1= System.currentTimeMillis();
long time1= Etime1- Stime1;
double c=100000- time1;
xscore=(long)c;
以上代碼同樣采用算法消耗的時(shí)間來評(píng)估分?jǐn)?shù),計(jì)算整數(shù)運(yùn)算分?jǐn)?shù)的原理和浮點(diǎn)運(yùn)算的分?jǐn)?shù)原理是一樣的。3.2.1.2 文件讀寫性能算法設(shè)計(jì)
內(nèi)存卡的讀寫速度是指內(nèi)存卡的傳輸速率。不同的內(nèi)存卡有不同的速度等級(jí),一般情況下速度等級(jí)越高傳輸速度越快。SD2.0規(guī)范中對(duì)于SD卡的性能上分為4個(gè)等級(jí)。分別是:
0:包括低于Class2和未標(biāo)注SpeedClass的情況,
2:傳輸速率至少2MB/s,最大約6MB/s,
4:傳輸速率至少4MB/s,最大約10MB/s,
6:傳輸速率至少6MB/s,最大約20MB/s。
(1)寫文件算法設(shè)計(jì)。
寫文件的算法首先定義了一個(gè)200兆固定值大小的文件。通過寫入200兆文件的時(shí)間。評(píng)估出手機(jī)寫入文件的性能。核心代碼如下:
以上寫文件代碼定義了一個(gè)200兆大小的文件進(jìn)行寫入,通過循環(huán)寫入字節(jié)的方式完成。該文件的寫入需要用戶在運(yùn)行該測(cè)試程序前同意寫入的操作權(quán)限請(qǐng)求,文件寫入的位置為/storage/emulated/0/paofen/paofen。在測(cè)評(píng)完成后,會(huì)自動(dòng)刪除。不會(huì)對(duì)系統(tǒng)造成任何影響。這兒的文件大小可以自由設(shè)置。文件越大,計(jì)算的時(shí)間就越精確。
計(jì)算得分的代碼如下:
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);
根據(jù)寫文件算法的執(zhí)行時(shí)間,計(jì)算出每秒可寫入文件的速率wtspeed。得出最后的分?jǐn)?shù)zspeed。
(2)讀文件算法設(shè)計(jì)。
讀取文件的位置與文件算法生成的文件位置是一樣的。通過創(chuàng)建輸入流和輸出流,按照字節(jié)大小的粒度進(jìn)行讀取。根據(jù)讀取消耗的時(shí)間評(píng)估結(jié)果。
以上代碼在運(yùn)算完成讀取文件的算法后會(huì)消耗一定的時(shí)間,此處的讀取文件的大小和寫文件的大小一致,主要是為了保證讀寫文件時(shí)間的計(jì)算計(jì)算精確度,以及程序運(yùn)行完后垃圾文件的處理方便。
(3)得分計(jì)算的代碼如下:
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)
根據(jù)讀取文件算法的執(zhí)行時(shí)間,計(jì)算出每秒讀取入文件的速率dqspeed。得出最后的分?jǐn)?shù)hspeed。
(4)其他算法設(shè)計(jì)介紹。
在GPU調(diào)用、接口讀寫、網(wǎng)絡(luò)吞吐率的測(cè)試中。同樣是在毫秒級(jí)別時(shí)間的維度進(jìn)行測(cè)試,根據(jù)定量分析的思路,計(jì)算出合理的分?jǐn)?shù)。例如關(guān)鍵接口的調(diào)用,調(diào)用一次的時(shí)間無法估算出性能,所以通過指數(shù)級(jí)別次數(shù)的調(diào)用過程中,產(chǎn)生的時(shí)間則能精確計(jì)算出性能的優(yōu)劣。網(wǎng)絡(luò)吞吐率主要是通過遠(yuǎn)程下載和上傳固定大小的文件,來評(píng)估手機(jī)網(wǎng)絡(luò)吞吐率的性能。
其他重要的功能在設(shè)置模塊,主要有測(cè)評(píng)記錄、清除測(cè)評(píng)記錄。
測(cè)評(píng)記錄數(shù)據(jù)存儲(chǔ)在本地,主要是為了避免個(gè)人用戶擔(dān)心此類跑分軟件會(huì)不會(huì)竊取手機(jī)內(nèi)個(gè)人隱私數(shù)據(jù)到服務(wù)器的顧慮。數(shù)據(jù)存儲(chǔ)本地化的設(shè)計(jì)的原因有兩個(gè)。第一,簡(jiǎn)化數(shù)據(jù)的處理,直接存儲(chǔ)在本地避免了與服務(wù)端進(jìn)行通信,簡(jiǎn)化了數(shù)據(jù)處理流程,節(jié)約了服務(wù)器的成本。第二,打消用戶對(duì)個(gè)人隱私數(shù)據(jù)的顧慮。
功能設(shè)計(jì)主要代碼如下:
以上代碼中,在跑分完全結(jié)束后,會(huì)在/storage/emulated/0/paofen/paofen通過writeTxt函數(shù)創(chuàng)建一個(gè)文件,將數(shù)據(jù)作為txt,直接存儲(chǔ)在文件里。readFileContent讀取文件展示在頁(yè)面里。
此外,為了提升系統(tǒng)運(yùn)行的體驗(yàn),設(shè)置了數(shù)據(jù)清除的功能。在設(shè)置中點(diǎn)擊清除跑分記錄,則全部清除歷史數(shù)據(jù)。
代碼如下:
點(diǎn)擊手機(jī)主頁(yè)“一鍵測(cè)評(píng)”,在該自動(dòng)化程序運(yùn)行完成后,測(cè)評(píng)結(jié)果先會(huì)通過彈框的形式展示出來??梢郧逦恼故境鲈撌謾C(jī)的所有性能。
在測(cè)試實(shí)驗(yàn)測(cè)試階段,經(jīng)過多款常用的手機(jī),多次的性能測(cè)試后。得出的結(jié)果如表1所示。
表1:性能測(cè)試結(jié)果(注:此排名僅供參考)
在移動(dòng)終端OS性能自動(dòng)化測(cè)試系統(tǒng)整個(gè)開發(fā)過程中,通過對(duì)Adnroid開發(fā)技術(shù)的學(xué)習(xí)以及手機(jī)系統(tǒng)功能的研究,確定了使用Android Fragment頁(yè)面框架-Xpage,以及非遠(yuǎn)程存儲(chǔ)數(shù)據(jù)的設(shè)計(jì)方案。嚴(yán)格按照前期的需求設(shè)計(jì)與需求說明,進(jìn)行架構(gòu)的搭建與開發(fā),然后進(jìn)行了整個(gè)系統(tǒng)的編碼開發(fā)工作,最后通過對(duì)系統(tǒng)的測(cè)試及調(diào)優(yōu),完成了整體的工作。
通過對(duì)多款手機(jī)的測(cè)試,基本上實(shí)現(xiàn)了移動(dòng)終端OS性能自動(dòng)化測(cè)試系統(tǒng)預(yù)期的設(shè)計(jì)目標(biāo)與初衷,使用該測(cè)評(píng)系統(tǒng)能夠完整的對(duì)手機(jī)的性能進(jìn)行全面的測(cè)評(píng),并得出測(cè)評(píng)結(jié)果,用戶在使用體驗(yàn)中,對(duì)系統(tǒng)有比較好的認(rèn)可和良好的反饋。