Shell指令碼 | 效能測試之啟動時間

Shengjie發表於2019-02-22

安卓應用的效能測試,通常包括六個指標:啟動時間、記憶體、CPU、耗電量、流量、流暢度。

除了耗電量,其他五個指標的資料在我們團隊中已經可以通過執行指令碼的方式獲取到。

今天給大家分享下啟動時間的指令碼吧~

首先,我們先明確一下安卓應用的啟動時間應該如何計算。在這裡,我給出一條命令:

adb shell am start -W <Package_Name>/<Activity_Name>

"adb shell",安卓除錯橋(Android Debug Bridge),這個大家都知道,不多解釋。"am"指的是什麼呢?Activity Manager,活動管理器,通過它可以啟動App、啟動Activity以及啟動廣播和服務等等。

安卓應用在啟動時都會先出現一個歡迎頁,它其實就是一個Activity。應用從被點選到出現歡迎頁的這段時間,被定義為啟動時間。在知道應用歡迎頁的 Activity Name 後,就可以通過上面這條命令來獲取啟動時間。
Shell指令碼 | 效能測試之啟動時間
圖中的 "TotalTime" 即是本次啟動所花費的時間,單位毫秒(ms)。

在知道啟動時間的測試方法後,我們再來確定啟動時間的不同場景。應用啟動時間的場景差異,主要有四個:
1、首次安裝:第一次下載應用後的啟動時長;
2、覆蓋安裝:舊版本升級到新版本後的啟動時長;
3、冷啟動:殺掉應用的所有程式後的啟動時長;
4、熱啟動:back鍵正常退出應用後的啟動時長。

目前,我們團隊的啟動時間測試只包括首次安裝、冷啟動和熱啟動。

接下來,用指令碼說話吧:

#!/bin/bash
# Author: Shengjie.Liu
# 安裝應用,傳入引數:apk檔案的絕對地址
function install() {
  adb install ${1}
  sleep 5s
  adb shell input keyevent 3
}
# 解除安裝應用,傳入引數:應用包名
function uninstall() {
  adb uninstall ${1}
  sleep 2s
}
# 獲取啟動時間,傳入引數:<包名>/<啟動頁活動名>
function getStartupTime() {
  adb shell am start -W  ${1} | grep  -i Total | sed 's/ //g' | tr -d $'\r' | cut -d":" -f 2
  sleep 2s
}
# 清除應用所有程式,傳入引數:應用包名
function clearApp() {
  adb shell am force-stop ${1}
  sleep 10s
}
# Back鍵退出應用
function quitApp() {
  adb shell input keyevent 4
  adb shell input keyevent 4
  adb shell input keyevent 4
  sleep 2s
}
# 執行指令碼後,提醒輸入APK檔案地址和包名&啟動頁活動名
read -p "請輸入APK地址:" apk_address
read -p "請輸入包名和活動名:" component
# 擷取出包名賦值給變數"package_name"
package_name=$(echo ${component} | cut -d"/" -f1)
echo "Package name is '${package_name}'"
# 獲取首次安裝的啟動時間,重複三次,最後取平均值
install ${apk_address}
starttime1=`getStartupTime ${component}`
uninstall ${package_name}
# 第二次
install ${apk_address}
starttime2=`getStartupTime ${component}`
uninstall ${package_name}
# 第三次
install ${apk_address}
starttime3=`getStartupTime ${component}`
sleep 20s
# 三次的啟動時間
echo "首次安裝時間(ms):$starttime1 $starttime2 $starttime3"
# 平均值
echo "($starttime1+$starttime2+$starttime3)/3" | bc
# The first installation time test is over, beginning warm boot test
quitApp
# 獲取熱啟動的啟動時間(同上,重複三次,取平均值)
starttime1=`getStartupTime ${component}`
quitApp
starttime2=`getStartupTime ${component}`
quitApp
starttime3=`getStartupTime ${component}`
quitApp
echo "熱啟動時間(ms):$starttime1 $starttime2 $starttime3"
echo "($starttime1+$starttime2+$starttime3)/3" | bc
# 獲取冷啟動的啟動時間(同上,重複三次,取平均值)
clearApp ${package_name}
starttime1=`getStartupTime ${component}`
clearApp ${package_name}
starttime2=`getStartupTime ${component}`
clearApp ${package_name}
starttime3=`getStartupTime ${component}`
echo "冷啟動時間(ms):$starttime1 $starttime2 $starttime3"
echo "($starttime1+$starttime2+$starttime3)/3" | bc
# 啟動時間測試結束,解除安裝應用
uninstall ${package_name}

因為安卓手機的多樣性,此指令碼未做容錯處理,部分手機在指令碼執行過程中可能會彈出許可權確認框或者其他介面,從而導致指令碼執行失敗。這個問題,大家可以根據自己手機的特性來做對應處理。


歡迎關注微信公眾號“測試開發Stack”,更多原創文章第一時間釋出!

相關文章