本文由雲+社區發表android
做者:騰訊移動品質中心TMQgit
在2017年Google I/O大會上,Google發佈了Google Play管理中心的新功能:Android vitals。當app在大量設備上運行時,Android vitals會收集與應用性能相關的各類匿名數據,好比:與app穩定性相關的數據、app啓動時間、電量使用狀況、渲染時間以及權限遭拒等等,這些數據會被分析整理後展現在Google Play管理中心的Android vitals dashboard中。Android vitals 中須要開發者重點關注的核心指標有:crash率、ANR率、excessive wakeups(過渡喚醒)、stuck wake locks(喚醒鎖定卡住)。其餘指標,需根據應用類型選擇性關注(Android vitals中的指標總覽見圖1-1)。若app某些指標表現不好,會影響用戶體驗,而且會致使應用在Google Play商店中的等級很低、排名靠後(APP指標異常示例圖見圖1-2)。開發者能夠經過分析Android vitals中提供的一些參照指標,採起相應的措施來優化app。github
圖1-1 Android vitals平臺檢測指標總覽web
圖1-2 某APP指標異常示例圖shell
二、核心指標詳細信息:api
要對APP的指標進行監控,首先要明確該指標在Android vitals中是如何進行統計的,這一節主要介紹電量相關核心指標的基本概念和計算方式。服務器
Android系統自己爲了優化電量的使用,會在沒有操做時進入休眠狀態, 來節省電量。爲了便於開發(不少應用不可避免的但願在滅屏後還能運行一些事兒,或是要保持屏幕一直亮着--好比播放視頻),Android提供了一個PowerManager.WakeLock的東西。咱們能夠用WakeLock來保持CPU運行,或是防止屏幕變暗/關閉,讓手機能夠在用戶不操做時依然能夠作一些事兒。然而,獲取WakeLock很容易,釋放很差就會成爲難題,消耗電量。網絡
例如咱們獲取了一個WakeLock來保持CPU運轉,作一個複雜運算並將數據上傳到後臺服務器, 而後釋放該WakeLock。然而這個過程可能並不像咱們想象的那麼快,可能由於好比服務器掛掉,計算出了異常等等WakeLock沒有釋放。問題就來了,CPU會一直得不到休眠,而大大增長耗電。session
喚醒鎖可劃分爲並識別四種用戶喚醒鎖:app
自 API 等級 17 開始,FULL_WAKE_LOCK 將被棄用。應用應使用FLAG_KEEP_SCREEN_ON。
相關連接:developer.android.com/reference/a…
部分喚醒鎖可確保CPU正常運行,但屏幕和鍵盤背光能夠關閉。若是運行在後臺的APP長時間持有某個部分喚醒鎖,就致使部分喚醒鎖卡住。這種狀況十分消耗設備電量,由於它會阻止設備進入低電量狀態。Android vitals重點關注了stuck partial wake locks這項指標,當你的APP存在喚醒鎖定卡住的現象時,它會經過Play管理中心給出告警(APP出現部分喚醒鎖定卡住示例圖見圖2-1),並從各個維度給出相關的詳細統計圖(如圖2-2中給出每一個工做時段後臺wake lock最長持續時間分佈圖)。當出現如下狀況時,Android vitals會報告喚醒鎖定卡住:
(ps:battery session指兩次電池充滿電之間的時間間隔,Android vitals展現的battery sessions是全部app測試用戶的battery session合計。)
相關連接:developer.android.google.cn/topic/perfo…
圖2-1 某APP出現部分喚醒鎖定卡住(後臺)示例圖
圖2-2 每一個工做時段後臺wake lock最長持續時間的分佈圖
Wakeups 是AlarmManager API中的一種機制,開發者能夠設置一個alarm在特定的時間來喚醒設備。當某個喚醒alarm觸發,設備會走出低電量模式,在執行alarm的onRecieve()或onAlarm()方法的時候,Alarm Manager會持有一個部分喚醒鎖。若是wake alarms頻繁觸發,會耗盡設備電量。Android vitals中展現了app的過渡喚醒次數。
Alarm有如下四種類型:
1)RTC_WAKEUP
在指定的時刻(設置Alarm的時候),喚醒設備來觸發Intent。
2)RTC
在一個顯式的時間觸發Intent,但不喚醒設備。
3)ELAPSED_REALTIME
從設備啓動後,若是流逝的時間達到總時間,那麼觸發Intent,但不喚醒設備。流逝的時間包括設備睡眠的任什麼時候間。注意一點的是,時間流逝的計算點是自從它最後一次啓動算起。
4)ELAPSED_REALTIME_WAKEUP
從設備啓動後,達到流逝的總時間後,若是須要將喚醒設備並觸發Intent。
在Android vitals中只列出了RTC_WAKEUP和ELAPSED_REALTIME_WAKEUP兩種類型的喚醒數據,Google會統計每小時發生10次以上wakeup的電池工做時段百分比(APP發生過渡喚醒示例見圖2-3)。分別從應用版本、wakeup標記、設備、Android版本等幾個維度統計每小時的Alarm Manager wakeup次數(每一個工做時段中每小時的wackup分佈圖見圖2-4)。
圖2-3 某APP發生過渡喚醒示例圖
圖2-4 每一個工做時段每小時wakeup次數分佈圖
三、測試方法研究
咱們以前也對騰訊視頻主線版本進行過電量測試,以前關注的重點在於APP在各場景中耗電量是否正常,是從比較宏觀的角度去進行測試的,採起的測試方法主要是物理儀器測試法和GT測試法。
在保持電壓恆定的狀況下,獲取各場景平均電流值來統計系統耗電狀況,經過此方法能夠從大致上看出APP電量消耗是否正常,若儀器精度大,此方法測出的電量值是最準確的。
缺陷:此方法只能測試整個手機的電流,不能區分APP,受影響的因素多,如屏幕亮度大小、音量大小等等,要保證每次測試的環境徹底一致是不可能的。
圖3-1 物理儀器測電量
GT(隨身調)是由MIG專項測試組自主研發的APP隨身調測平臺,它是直接運行在手機上的「集成調測環境」(IDTE, Integrated Debug Environment)。利用GT,僅憑一部手機,無需鏈接電腦,您便可對APP進行快速的性能測試(CPU、內存、流量、電量、幀率/流暢度等等)、開發日誌的查看、Crash日誌查看、網絡數據包的抓取、APP內部參數的調試、真機代碼耗時統計等。
經過GT,能夠採集手機耗電量相關數據:電流、電壓、電量、溫度等,經過分析這些數據,能夠對整個手機的電量使用狀況進行分析。
缺點:和物理儀器測試方法同樣,採用GT測試也只能獲取到整個手機的電量數據,沒法只關注單獨APP,且受各類因素影響較大。
因爲國際版APP在Google Play上發佈,咱們作電量測試不只僅須要關注整個APP的電量使用狀況是否正常,還須要關注APP持有 wack lock和使用alarm的狀況。所以,傳統的電量測試方法已經沒法知足咱們的需求,咱們須要在此基礎上增長額外的測試方法。
Android5.0後,電量數據可經過dumpsys batterystats獲取。Android系通通計耗電量的基本公式是W=UIt。在手機中,U通常恆定不變,所以能夠單獨經過Q(電容量)=I*t來表示電量。核心類BatterStatsImpl提供App各部件運行時間、PowerProfile提供部件電流數值。Android部件電流信息存於:power_profile.xml文件中,每一個OEM廠商都有私有的power_profile.xml文件,PowerProfile經過讀取該文件獲取訪問部件電流數值(圖3-3是samsung某型號的power_profile.xml)。Android系統以uid爲單位,依次統計每一個apk的使用cpu使用耗電量、wake lock耗電量、移動數據耗電量、wifi數據耗電量、wifi維持耗電量、wifi掃描耗電量、各傳感器耗電量。其中wake lock消耗的電量只統計了持有Partial wake lock的耗電量,正好是咱們須要關注的喚醒類型,所以咱們能夠經過分析batterystats得到的電量數據來測試app持有Partial wake lock狀況。
Android爲了方便開發人員分析整個系統平臺和某個app在運行一段時間以內的全部信息,專門開發了bugreport工具。bugreport文件中記錄了系統容許過程當中的各類log信息,其中也包括了耗電量信息。經過分析bugreport中的電量相關數據也能獲取APP持有Partial wake lock的信息。
ps:Uid與App關係:2個App簽名和sharedUserId相同,則在運行時,他們擁有相同Uid。就是說processAppUsage統計的多是多個App的耗電量數據,對於普通App,出現這種狀況的概率較少,而對於Android系統應用則較爲常見。
圖3-2 wack lock耗電量計算源代碼
圖3-3 sumsung某型號power_profile.xml
數據準備:
(1)adb kill-server
(2)adb start-server
因爲開發時作電量記錄時會打開不少可能形成衝突的東西,爲了保險起見,重啓adb命令。
(3) adb shell dumpsys batterystats --enable full-wake-history
(4) adb shell dumpsys batterystats --reset
(5) adb shell logcat -c
經過以上命令來打開電池數據的獲取以及重置,清除干擾的數據,清除歷史日誌。
把數據線拔掉,防止數據線形成充放電數據干擾。而後作一些測試的case,通過一段時間後,從新鏈接手機確認adb連上了,運行如下命令來將bugreport的信息保存到txt文件中。
(6) adb bugreport >D:/bugreport.txt
或者用下面的命令也能夠,官網上記述的內容,經實踐,沒法被讀取…
(7) adb shell dumpsys batterystats > batterystats.txt
(8) adb shell dumpsys batterystats > com.example.app(包名) >batterystats.txt
ps:在此注意必定要等到該條命令執行完(稍微會有些慢)後,再打開bugreport.txt文件,以前遇到過沒有導出完,就點開,信息缺失的狀況,致使沒法成功生成圖表。
生成的bugreport文件有的時候異常龐大,可以達到15M+,想想對於一個txt文本格式的文件內容長度達到了15M+是一個什麼概念,若是使用文本工具打開查看將是一個噩夢。所以google針對android 5.0(api 21)以上的系統開發了一個叫作battery historian的分析工具,這個工具就是用來解析這個txt文本文件,而後使用web圖形的形式展示出來,這樣出來的效果更加人性化,更加可讀。咱們可使用該工具對bugreport文件進行解析,更輕鬆的獲取電量相關數據。
battery historian的安裝能夠參考如下連接:
developer.android.com/studio/prof…
也能夠直接使用在線版本:
數據分析:
(1)選擇騰訊視頻app
(2)Wacklocks表格中展現app持有的wacklock,持有時間及數量,經過這個表格咱們能夠看到咱們APP是否有持有一小時以上的wack_lock。
(3)Wakeup alarm info表格中展現了APP運行過程當中觸發的wakeup alarm名字和個數,經過該分析工具也能夠統計app的鬧鐘喚醒次數。
QAPM是SNG開發的致力於解放專項測試人員的工具平臺,該平臺帶有電量監控功能,在電量個例菜單中會統計前臺30分鐘、後臺5分鐘兩個場景下的wacklock持有信息。該平臺上的數據能夠做爲咱們電量測試的參考對象,具體的統計方法還需後續深刻了解。
Android提供的dumpsys工具可以用於查看感興趣的系統服務信息與狀態,手機鏈接電腦後可以直接命令行運行adb shell dumpsys 查看電池、電量相關信息。
經過該條命令能夠看到手機中全部的wack_lock持有信息
此命令會提供設備上的alarm系統服務相關信息。其中Alarm Stats列出了應用設置alarm的狀況,其中有系統被該應用全部alarm消耗的時間以及被鬧鐘喚醒的次數。能夠經過獲取一小時內的電量數據來分析用戶在每小時的喚醒次數。
相關連接:blog.csdn.net/memoryjs/ar…
該方法與經過burgreport文件統計電量信息相似,都是經過Android系統中提供的工具來輸出電量的消耗狀況,且該種方式輸出的報告也比較複雜,可讀性查,可在測試過程當中做爲參考。
四、國際版電量測試方法總結與實踐
騰訊視頻國際版1.0.0已經發布,咱們已經使用該方法對其進行了一次電量測試,具體測試過程以下:
測試場景:啓動-播放-前臺靜置
測試機器:nexus
測試結果分析:
測試場景:
測試型號:
測試結果分析:
場景 | 機型 | 持有1小時以上的wack lock |
---|---|---|
app前臺 | 華爲Y7 Pro 2018 (LDN-LX2) | 無 |
OPPO F7 (CPH1819) | 無 | |
app後臺 | 華爲Y7 Pro 2018 (LDN-LX2) | 無 |
OPPO F7 (CPH1819) | 無 | |
全屏播放 | 華爲Y7 Pro 2018 (LDN-LX2) | WindowManager |
OPPO F7 (CPH1819) | WindowManager |
\2. 測試過程當中沒有統計到alarm數據,說明國際版APP暫時沒有使用到AlarmManager定時任務。
場景 | 啓動APP | 播放 | 退出播放,前臺靜置 |
---|---|---|---|
結論 | 啓動過程需加載圖片等資源,電流較大,正常 | 播放過程電流平穩無異常 | 退出播放電流變小,靜置過程平穩無異常 |
\2. Battery Historian分析電量數據得出,前臺靜置、後臺靜置、播放三個場景中僅播放場景會持有wack lock1小時以上,不屬於Android Vitals統計範疇,不會影響到國際版APP在Google Play商店的排名。
場景 | 機型 | stuck wake locks | excessive wakeups | 結論 |
---|---|---|---|---|
前臺靜置 | 華爲Y7 Pro | 無喚醒鎖定卡住 | 無過渡喚醒 | 正常 |
OPPO F7 | 無喚醒鎖定卡住 | 無過渡喚醒 | 正常 | |
後臺靜置 | 華爲Y7 Pro | 無喚醒鎖定卡住 | 無過渡喚醒 | 正常 |
OPPO F7 | 無喚醒鎖定卡住 | 無過渡喚醒 | 正常 | |
播放 | 華爲Y7 Pro | 持有喚醒鎖1小時以上 | 無過渡喚醒 | 正常 |
OPPO F7 | 持有喚醒鎖1小時以上 | 無過渡喚醒 | 正常 |
五、總結與展望
因爲騰訊視頻國際版目前功能比較少,用到wack_lock和alarm的狀況比較少,咱們只測試了前臺靜置、後臺靜置、播放三個場景,電量測試的結果也顯示APP電量使用狀況正常,無部分喚醒鎖定卡住和過渡喚醒的狀況出現,後續國際版功能會日漸豐富,可能須要補充push、下載等測試場景,持有wack_lock和alarm的狀況也會更加複雜,所以咱們會根據實際狀況不斷改進和完善咱們的電量測試方法。
此文已由騰訊雲+社區在各渠道發佈
獲取更多新鮮技術乾貨,能夠關注咱們騰訊雲技術社區-雲加社區官方號及知乎機構號