Android用戶也許會經常碰到以下的問題:
1)應用后台開着,手機很快沒電了——應用耗電大
2)首次/非首次啟動應用,進入應用特別慢——應用啟動慢
3)應用使用過程中,越來越卡——CPU能力不足/內存泄露
4)應用頁面卡頓——幀率較低、頁面卡頓
因此,對開發的Android應用,必須對其進行性能測試,不然將會直接影響用戶體驗。
一.啟動時間
啟動時間同樣也遵循2-5-8原則,所謂2-5-8原則就是當用戶能夠在2秒以內啟動應用進入第一幀,會感覺系統的響應很快;當用戶在2-5秒之間得到響應時,會感覺系統的響應速度還可以;當用戶在5-8秒以內得到響應時,會感覺系統的響應速度很慢,但是還可以接受;而當用戶在超過8秒后仍然無法得到響應時,會感覺系統糟透了,或者認為系統已經失去響應,而選擇退出這個app或者卸載該app。因此啟動時間對用戶的使用行為起到至關重要的作用。
這里啟動時間分兩種情況:首次啟動(冷啟動)和非首次啟動(熱啟動)應用所花費的時間。
在測試app啟動時間之前,我們先來看看這張經典的Activity生命周期圖,如圖1。
圖1 Activity的生命周期
流程簡介:
1.啟動Activity:系統會先調用onCreate方法,然后調用onStart方法,最后調用onResume,Activity進入運行狀態。
2.當前Activity被其他Activity覆蓋或被鎖屏:系統會調用onPause方法,暫停當前Activity的執行。
3.當前Activity由被覆蓋狀態回到前台或解鎖屏:系統會調用onResume方法,再次進入運行狀態。
4.當前Activity轉到新的Activity界面或按Home鍵回到主屏,自身退居后台:系統會先調用onPause方法,然后調用onStop方法,進入停滯狀態。
5.用戶后退回到此Activity:系統會先調用onRestart方法,然后調用onStart方法,最后調用onResume方法,再次進入運行狀態。
6.當前Activity處於被覆蓋狀態或者后台不可見狀態,即第2步和第4步,系統內存不足,殺死當前Activity,而后用戶退回當前Activity:再次調用onCreate方法、onStart方法、onResume方法,進入運行狀態。
7.用戶退出當前Activity:系統先調用onPause方法,然后調用onStop方法,最后調用onDestory方法,結束當前Activity。
從Activity的生命周期流程圖,我們可以看出啟動時間即onCreate()方法開始執行到onResume()方法執行結束的時間,也就是activity完全啟動的時間。
那么怎么獲取該時間?
方法一:通過logcat中ActivityManager的相關數據獲取。
1)ddms設置過濾條件“by Log Tag”為:ActivityManager;
2)啟動app,查看通過DDMS抓取到的log。
以2345王牌瀏覽器app為例,可查看獲得log如下:
除了通過DDMS抓取外,還可以通過adb logcat命令來獲取。
>adb logcat -d -s ActivityManager|findstr "Displayed">D:\log.txt
其實兩者獲取到的信息是一樣的(這里演示時非同一次啟動,因此啟動時間有點差異)。只是DDMS抓的通常是main緩存中的,也就是應用程序打印的日志文件,可以實時查看。而通過命令抓取的話,只能重定向到文件,抓完之后才能查看。
方法二:adb命令獲取,在前面的博文常用的adb命令中對adb shell也有些許介紹。
1)獲取app包名和類名
>adb shell dumpsys activity|findstr mFocusedActivity
2)獲取啟動時間
>adb shell am start -W –n <packageName>/<activityName>
通過比較,可以發現這兩種方法獲取到的時間是一樣的。(注意:這兩種方法都是同一次啟動,非同一次啟動,會有差異)
對於這幾個時間,這里引用知乎作者Gracker答案中的結論:“如果只關心某個應用自身啟動耗時,參考TotalTime;如果關心系統啟動應用耗時,參考WaitTime;如果關心應用有界面Activity啟動耗時,參考ThisTime。”
二.性能測試工具——Emmagee
Emmagee是一款簡單易用的Android性能檢測小工具,主要用於監控單個App的CPU,內存,流量,啟動耗時,電量,電流等性能狀態的變化。
1)通過官方網站安裝(個別機型目前不支持),設置“應用退出后台后仍可監聽”便於自動化測試。
2)通過adb命令在sdcard目錄下pull出測試結果csv文檔(也可通過app配置郵箱,發送到自己的郵箱)。
3)查看測試結果csv文檔,這里以百度瀏覽器app為例,測試結果如下。
注釋:
已知部分不支持的機型可在此查閱:https://github.com/NetEase/Emmagee/wiki/Some-devices-are-not-supported
電流: 小於0是放電大於0是充電
啟動時間: 為空是應用已啟動或者未搜集到啟動時間
N/A: 不支持或者數據異常
4)利用excel的功能生成統計圖,方便分析。
該工具測試的結果可作為測試參考,另外對於幀率還可以用FPS Meter工具進行測試。
三.利用adb命令監測app相關性能信息
在這里就不一一演示了。
//內存使用率 1.adb shell dumpsys meminfo <pakagename> 2. 通過android提供的API來測試(ActivityManager.MemoryInfo()) //CPU占有率 1.adb shell top 2.adb shell dumpsys cpuinfo //功耗 1.adb shell dumpsys battery 2.通過android本身的API來測試(ProwerManager.WakeLock) //查看總體的CPU占用 # cat /proc/stat //查看進程的CPU占用 # cat /proc/<PID>/stat //查看總體的RAM # cat /proc/meminfo | head -n 4 //查看進程的RAM # dumpsys meminfo <packagename> # dumpsys meminfo <PID> //查看進程的當前RAM # procrank //開機后的總流量(字節數) # cat proc/self/net/dev //上傳流量/上行流量 # cat /proc/uid_stat/2000/tcp_snd //下載流量/下行流量 # cat /proc/uid_stat/2000/tcp_rcv
四.穩定性測試/壓力測試
在前面的博客常用的adb命令中介紹過adb shell monkey來對app進行壓力測試,請參考。
五.其他
在這里推薦兩個雲測平台:
1.itestin
2.騰訊優測
參考文獻:
1.Android Activity生命周期:http://kb.cnblogs.com/page/70125/
2.Emmagee官網:https://github.com/NetEase/Emmagee/releases