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