背景介紹
Android用戶也許會(huì)經(jīng)常碰到以下的問(wèn)題:
1)應(yīng)用后臺(tái)開著,手機(jī)很快沒(méi)電了——應(yīng)用耗電大;
2)首次/非首次啟動(dòng)應(yīng)用,進(jìn)入應(yīng)用特別慢——應(yīng)用啟動(dòng)慢;
3)應(yīng)用使用過(guò)程中,越來(lái)越卡——CPU能力不足/內(nèi)存泄露;
4)應(yīng)用頁(yè)面卡頓——幀率較低、頁(yè)面卡頓。
因此,對(duì)開發(fā)的Android應(yīng)用,必須對(duì)其進(jìn)行性能測(cè)試,不然將會(huì)直接影響用戶體驗(yàn)。
Android應(yīng)用性能測(cè)試通常包括:?jiǎn)?dòng)時(shí)間、內(nèi)存、CPU、耗電量、流量、流暢度等。我們將在這個(gè)月陸續(xù)為大家簡(jiǎn)單介紹一下每個(gè)測(cè)試點(diǎn)的常見(jiàn)測(cè)試方法及簡(jiǎn)單的定位思路,僅供參考。之前兩周內(nèi),我們?yōu)榇蠹医榻B了啟動(dòng)時(shí)間、內(nèi)存&CPU、內(nèi)存泄漏&卡頓"測(cè)試方法,本期我們介紹Android性能測(cè)試白皮書的最后一章——流量、電量、弱網(wǎng)環(huán)境的測(cè)試方法。
耗電
耗電操作主要包含CPU、WIFI、流量、傳感器(GPS NFC),以及應(yīng)用屏幕wakelock等操作。我們更多的是關(guān)注應(yīng)用本身是否劫持了系統(tǒng)的屏幕wakelock操作,沒(méi)有及時(shí)釋放屏幕wakelock,導(dǎo)致耗電。
電量測(cè)試監(jiān)控方法可以簡(jiǎn)單的從設(shè)置->電池->使用情況中查看,手機(jī)中的每個(gè)部件運(yùn)行時(shí)對(duì)應(yīng)的能耗值都放在power_profile.xml文件中,而系統(tǒng)的設(shè)置->電池->使用情況中,統(tǒng)計(jì)的能耗使用情況也是以power_profile.xml的value作為基礎(chǔ)參數(shù)的。通過(guò)命令監(jiān)控app個(gè)部件的使用時(shí)長(zhǎng),然后結(jié)合設(shè)備耗電的基礎(chǔ)參數(shù)進(jìn)行加權(quán)計(jì)算,即可得到app使用的耗電量。至于更詳細(xì)的耗電量測(cè)試,可以專門把耗電這一性能指標(biāo)拿出來(lái),專項(xiàng)測(cè)試。
流量
針對(duì)流量測(cè)試,首先要搞明白什么是流量?我們的收集通過(guò)運(yùn)營(yíng)商的網(wǎng)絡(luò)訪問(wèn)Internet,運(yùn)營(yíng)商替我們的手機(jī)轉(zhuǎn)發(fā)數(shù)據(jù)報(bào)文,數(shù)據(jù)報(bào)文的總大?。ㄗ止?jié)數(shù))即流量,這里的數(shù)據(jù)報(bào)文包含手機(jī)上下行的報(bào)文。由于數(shù)據(jù)報(bào)文采用IP協(xié)議傳輸,運(yùn)營(yíng)商計(jì)算的流量一般是包含IP頭的數(shù)據(jù)報(bào)文大小。
下面就介紹兩種流量的測(cè)試方法:
1、tcpdump+Wireshark抓包測(cè)試法
流量測(cè)試最直接的方法就是抓包。在App運(yùn)行期間,把手機(jī)收發(fā)的所有報(bào)文度抓取下來(lái),再計(jì)算收發(fā)報(bào)文總大小,即App消耗的流量。但是如果我們需要測(cè)試某一個(gè)App消耗的流量需要禁用其他APP的連網(wǎng)權(quán)限。
1)限制其他app的聯(lián)網(wǎng)權(quán)限,因?yàn)橛行〢pp的進(jìn)程是常駐后臺(tái)的,即使不運(yùn)行,也會(huì)有網(wǎng)絡(luò)報(bào)文??梢越柚恍┦謾C(jī)管家軟件禁用網(wǎng)絡(luò)。
2)手機(jī)上抓包,下載tcpdump,手機(jī)連接電腦,獲得root權(quán)限。
3)將?tcpdump?(forAndroid)上傳至Android手機(jī)上,在命令提示符窗口中輸入命令:adbpush? ?? /data/local/tcpdump

4)給?tcpdump?增加可執(zhí)行權(quán)限
adb shell
su
chmod 6755 /data/local/tcpdump

5)啟動(dòng)抓包,使用命令/data/local/tcpdump-v -i any -s 0 -w /sdcard/zhangyu.pcap

Got后面的數(shù)字表示當(dāng)前抓到的包的數(shù)量。如果有變化,表示有網(wǎng)絡(luò)流量。
6)導(dǎo)出抓包結(jié)果adb pull /sdcard/zhangyu.pcap
7)用Wireshark打開剛才的抓包結(jié)果,點(diǎn)擊StatisticsàSummary,流量的數(shù)值為Bytes一行的Displayed一欄。

2、使用安卓自身提供的TCP收發(fā)長(zhǎng)度統(tǒng)計(jì)功能
一般APP和后臺(tái)服務(wù)器之間的通信都是基于TCP的,所以我們可以利用此統(tǒng)計(jì)來(lái)測(cè)試我們APP的流量,而且安卓提供的該統(tǒng)計(jì)功能是按照APP緯度來(lái)統(tǒng)計(jì)的,不需要禁止其他app的連網(wǎng)權(quán)限。
操作步驟如下:
1)使用ps命令查看所測(cè)app的uid,例如貼吧的uid為10000+191=10191
adbshell
su
ps |grep com.baidu.tieba

2)進(jìn)入/proc/uid_stat/1191目錄,cat獲取當(dāng)前tcp_snd和tcp_tcv的初始值

3)此時(shí)可以開始測(cè)試了,測(cè)試完成后再次獲取tcp_snd和tcp_tcv的值

4)所測(cè)時(shí)間內(nèi)的流量計(jì)算
發(fā)送流量:tcp_snd_new-tcp_snd_old=2032150-893233=1128917bytes
接收流量:tcp_rcv_new-tcp_rcv_old=18648825-1350829=17297996bytes
弱網(wǎng)環(huán)境
在進(jìn)行手機(jī)應(yīng)用測(cè)試時(shí),經(jīng)常需要模擬網(wǎng)絡(luò)不穩(wěn)定的狀態(tài)下對(duì)測(cè)試執(zhí)行的影響。調(diào)研了幾款工具,可以通過(guò)手動(dòng)設(shè)置數(shù)據(jù)丟包率,以及網(wǎng)絡(luò)時(shí)延等參數(shù),模擬弱網(wǎng)環(huán)境。如Charles、clumsy、netlimite、atc等。
1、幾款工具的比較
1)Charles、Fiddler這樣的軟件只支持短連接,也就是說(shuō)只有走短連接的接口才生效,長(zhǎng)連接的不能使用。
缺點(diǎn):不支持長(zhǎng)連接
2)Atc工具和蘋果自帶的ios developer (開發(fā)者選項(xiàng))的使用方法是一樣的,需要在手機(jī)端操作,atc工具需要搭建一系列環(huán)境后,手機(jī)訪問(wèn)一個(gè)ip地址就能看見(jiàn)控制頁(yè)面,然后修改相應(yīng)的參數(shù)即可。
缺點(diǎn):不宜操作,每次修改網(wǎng)絡(luò)場(chǎng)景需要把被測(cè)app置于后臺(tái),切換到網(wǎng)絡(luò)模擬界面改參數(shù),然后再切回被測(cè)app。影響被測(cè)app的操作連貫性。
3) clumsy、netlimite等這類軟件易安裝,安裝在電腦端,手機(jī)通過(guò)共享網(wǎng)絡(luò)連接電腦,實(shí)時(shí)的將系統(tǒng)接收和發(fā)出的網(wǎng)絡(luò)數(shù)據(jù)包攔截下來(lái),人工的造成延遲,掉包和篡改操作后再進(jìn)行發(fā)送。
4)購(gòu)買一些儀器,在全公司范圍搭建一個(gè)弱網(wǎng)環(huán)境。
缺點(diǎn):搭建成本高,需要有專門的技術(shù)人員支持。
綜合比較以上四類工具,第三類推薦在日常測(cè)試過(guò)程中使用。下面就拿clumsy舉例,介紹一下環(huán)境的搭建及使用。
2、clumsy環(huán)境搭建及使用
1)環(huán)境準(zhǔn)備
windows筆記本,clumsy安裝文件,共享網(wǎng)絡(luò)
2)安裝clumsy
clumsy免安裝程序,下載完成后,直接點(diǎn)擊exe可執(zhí)行文件即可。
下載地址:https://pan.baidu.com/s/1pLAjm2J密碼: mk8i
3)創(chuàng)建共享網(wǎng)絡(luò)
a、電腦連接網(wǎng)線,打開網(wǎng)絡(luò)和共享中心

b、點(diǎn)擊本地連接---屬性---共享---勾選第一個(gè),并選擇一個(gè)家庭網(wǎng)絡(luò)連接(此時(shí)本地連接會(huì)顯示共享的字樣)

c、cmd--輸入命令(啟動(dòng)cmd,最好用管理者身份啟動(dòng))
netshwlan set hostednetwork mode=allow ssid=zhangyu1 key=123456789(ssid和key對(duì)應(yīng)共享網(wǎng)絡(luò)的名稱和密碼,key不能低于8位)
netshwlan start hostednetwork
至此手機(jī)就會(huì)搜索到電腦共享的網(wǎng)絡(luò),然后連接即可。
3、clumsy參數(shù)說(shuō)明及使用
界面如下:

clumsy
首先根據(jù)用戶選擇的?filter?來(lái)攔截指定的網(wǎng)絡(luò)數(shù)據(jù)。在 filter
中可以設(shè)定你感興趣的協(xié)議(tcp/udp),端口號(hào),是接收還是發(fā)出的端口。你也可以通過(guò)簡(jiǎn)單的邏輯語(yǔ)句來(lái)進(jìn)一步縮小范圍。當(dāng) clumsy
被激活時(shí),只有符合這些標(biāo)準(zhǔn)的網(wǎng)絡(luò)數(shù)據(jù)會(huì)被進(jìn)行處理,而你不感興趣的數(shù)據(jù)仍然會(huì)由系統(tǒng)正常傳輸。
當(dāng)被 filter 的網(wǎng)絡(luò)數(shù)據(jù)包被攔截后,你可以選擇 clumsy 提供的功能來(lái)有目的性的調(diào)整網(wǎng)絡(luò)情況:
1.???延遲(Lag),把數(shù)據(jù)包緩存一段時(shí)間后再發(fā)出,這樣能夠模擬網(wǎng)絡(luò)延遲的狀況。
2.???掉包(Drop),隨機(jī)丟棄一些數(shù)據(jù)。
3.???節(jié)流(Throttle),把一小段時(shí)間內(nèi)的數(shù)據(jù)攔截下來(lái)后再在之后的同一時(shí)間一同發(fā)出去。
4.???重發(fā)(Duplicate),隨機(jī)復(fù)制一些數(shù)據(jù)并與其本身一同發(fā)送。
5.???亂序(Out of order),打亂數(shù)據(jù)包發(fā)送的順序。
6.???篡改(Tamper),隨機(jī)修改小部分的包裹內(nèi)容。
類似模擬網(wǎng)絡(luò)環(huán)境的軟件很多,大家可以針對(duì)自己的情況選擇,不要找環(huán)境搭建過(guò)于繁瑣的工具,簡(jiǎn)單易用就好。
定位常用軟件
在發(fā)現(xiàn)問(wèn)題后,定位分析時(shí),可以借助以下常用軟件。
1、traceview使用簡(jiǎn)介
TraceView 是 Android 平臺(tái)特有的數(shù)據(jù)采集和分析工具,它主要用于分析 Android 中應(yīng)用程序的 hotspot,可以方便的查看線程的執(zhí)行情況,某個(gè)方法執(zhí)行時(shí)間、調(diào)用次數(shù)、在總體中的占比等,從而定位性能點(diǎn)。
使用方法:
使用Android studio->Android Device Monitor->進(jìn)入DDMS->點(diǎn)擊開始按鈕

Case:在微粉首頁(yè)上下滑動(dòng),滑動(dòng)過(guò)程中等待圖片、視頻加載完成?。
點(diǎn)擊結(jié)束按鈕出現(xiàn)結(jié)果如下(劃分為上下兩個(gè)面板,即Timeline Panel(時(shí)間線面板)和Profile Panel(分析面板):

Timeline Panel又可細(xì)分為左右兩個(gè)部分:
(1)左邊顯示的是測(cè)試數(shù)據(jù)中所采集的線程信息。
(2)右邊所示為時(shí)間線,時(shí)間線上是每個(gè)線程測(cè)試時(shí)間段內(nèi)所涉及的函數(shù)調(diào)用信息。
(3)可以在時(shí)間線中移動(dòng)時(shí)間線縱軸。縱軸上邊將顯示當(dāng)前時(shí)間點(diǎn)中某線程正在執(zhí)行的函數(shù)信息。

Profile Panel(分析面板)
按調(diào)用次數(shù)由高到低排列結(jié)果如下圖

按照占用CPU時(shí)間從高到低排列結(jié)果如下圖:

2、Systrace使用簡(jiǎn)介
Systrace是Android4.1中新增的性能數(shù)據(jù)采樣和分析工具。它可幫助開發(fā)者收集Android關(guān)鍵子系統(tǒng)(如surfaceflinger、WindowManagerService等Framework部分關(guān)鍵模塊、服務(wù),View系統(tǒng)等)的運(yùn)行信息,從而幫助開發(fā)者更直觀的分析系統(tǒng)瓶頸,改進(jìn)性能。Systrace的功能包括跟蹤系統(tǒng)的I/O操作、內(nèi)核工作隊(duì)列、CPU負(fù)載以及Android各個(gè)子系統(tǒng)的運(yùn)行狀況等。
使用方法:
使用Android studio->Android Device Monitor

進(jìn)入DDMS->打開微粉APP->點(diǎn)擊開始systrace

設(shè)置參數(shù)->點(diǎn)擊OK

case:在微粉首頁(yè)滑動(dòng)列表,滑動(dòng)過(guò)程中需等待圖片視頻加載完成
在chrome地址欄中輸入chrome://tracing 點(diǎn)擊load打開trace.html文件

通過(guò)工具抓取的數(shù)據(jù)用瀏覽器打開后顯示如下:

查看Frames這一行,可以看到這里展示了被繪制出來(lái)的每一幀,并且用綠、黃、紅三顏色來(lái)區(qū)分它們?cè)诶L制時(shí)的性能

選一個(gè)紅色幀在底部給出Alter信息:

展開“Inflation during ListViewrecycling”這條警告(警告部分的總耗時(shí)155毫秒,遠(yuǎn)高于了我們對(duì)保障60fps所需的16毫秒繪制時(shí)間):

選擇這一幀中最長(zhǎng)的一塊,對(duì)其進(jìn)行進(jìn)一步分析整個(gè)區(qū)塊耗時(shí)98毫秒,而在這之中CPU只消耗了65毫秒的時(shí)間去運(yùn)算
