APP耗电量测试
現象
APP耗電,導致電池續航能力不佳,如下圖,在小米MIX2和iPhone X機型上后臺靜默一小時各應用的耗電排行:
基本概念
相對于PC來說,移動設備的電池電量是非常有限的,保持持久的續航能力尤為重要。另外,Android的很多特性都比較耗電(如屏幕、GPS、sensor傳感器、喚醒機制、CPU、連網等的使用),我們必須要慎重檢查APP的電量使用,以免導致用戶手機耗電發熱,帶來不良體驗。
場景設計
主要的耗電場景有:
cpu:復雜的運算邏輯、死循環等會直接導致CPU負載過高,會導致耗電;
wakelock:只要有應用拿到wakelock這個鎖,系統就無法進入睡眠狀態。頻繁wakelock或者申請了wakelock沒有釋放,會導致耗電;
wifiscan和wifilock:wifiscan和wifilock也會導致手機的wifi模塊處于激活狀態,頻繁的wifiscan或者wifilock不釋放,會導致耗電;
sensor:傳感器打開后會導致系統持續監聽設備外圍環境的數據變化,使用后不及時關閉,會導致耗電;
network:大量的數據傳輸,或者長時間的移動網絡數據傳輸導致radio長期處于活躍狀態,會導致耗電;
gps:gps也是一種傳感器,定位中沒有及時關閉,會導致耗電;
業務層面,用戶最核心基礎的模塊:
新增的基礎邏輯,倘若入口明顯,潛在較大訪問,必須保證性能;
活動需要,因為活動上新的邏輯,存在較大的用戶訪問,需盡力提升用戶體驗;
反饋體驗不好的模塊;
監控分析
耗電原理
1、各部件單位時耗電:各部件單位時耗電信息保存在power_profile.xml文件中,如下圖(以魅族MX6為例):
2、運行時長
電量(mAh)=各部件單位時耗電量(mA)*各部件運行時長(h)
數據獲取
測試環境
1、恢復出廠設置,排除其他APP對耗電的影響,減少干擾因素;
2、測試過程中,不出現充電情況;
3、Android 5.0 以上的設備;
4、通過wifi連接電腦和手機;
adb tcpip 5555
adb connect 192.168.1.101 (Android設備IP地址)
測試步驟
1、首先,電腦用數據線連接手機設備,開啟設備的開發者模式后,使用adb devices命令,能夠看到設備在線
2、打開電池數據獲取:
adb shell dumpsys batterystats --enable full-wake-history
3、重置電池數據:
adb shell dumpsys batterystats --reset
4、接下來可以拔掉數據線,在手機上對被測試app執行相應的用例進入測試場景
5、操作完成后,電腦再次連接設備,執行命令:
adb shell dumpsys batterystats > xxx.txt
# 因為bugreport時間比較長,我們放到后面執行來減少與前面dumpsys的數據的偏差
Android 7.0及以上:
adb bugreport bugreport.zip
Android 6.0及以下:
adb bugreport > bugreport.txt
獲取指定app的信息:
adb shell dumpsys batterystats > com.example.android.sunshine.app > batterystats.txt
6、打開Battery Historian平臺將bugreport.txt導入, 并點擊submit進行分析
案例分析
Case1:應用后臺靜默,wakelock長時間未釋放
如上圖,在一次版本的耗電量測試中發現耗電量顯著增加,通過進一步定位發現是應用中引入的某個SDK為了在后臺維持心跳使用了wakelock,而在用戶將應用切入后臺后一直持有沒有釋放,隨后經過跟對應的開發同學溝通進行了優化更改了實現方式去掉了wakelock,耗電量恢復正常。
Case2:應用后臺靜默,各種sensor持續工作
在做另外一個版本的專項測試中發現耗電量數據異常,如下圖,通過測試結果分析發現是應用在后臺駐留了51分鐘,各種傳感器也同樣工作了51分鐘導致耗電量顯著增加,后經過排查確定是引入的推送SDK導致的,經過修改調用方式解決。
Case3:應用前臺靜默,各種sensor持續工作
通過前臺靜默(無任何操作)15分鐘,發現耗電量比上個版本高了一倍,如下圖: 應用前臺靜默期間加速度、重力、陀螺儀這三個傳感器一直被使用。
跟開發溝通后確定是由于另外一個部門提供的SDK導致的,該SDK采集傳感器數據的策略有問題導致會在應用啟動后一直采集造成耗電,解決方案是按照時間窗口來采集數據, 比如每次打開APP采集5分鐘傳感器數據, 然后關閉傳感器數據采集。
通過標準
最佳實踐
附:iOS耗電量測試
上面主要是講的關于Android的耗電量測試方法及分析,當然思路是一樣的,關于iOS的耗電量測試由于還沒有具體的數據,這里給出一些我調研嘗試過的一些方法:
1、系統接口
iOS 10系統內置的Setting里可以查看各個APP的電池消耗,系統接口能獲取到整體的電池利用率,以及充電狀態。
該方案不能檢測固定某一時間段內的電池精準消耗。
2、硬件檢測
通過硬件PowerMonitor可以精準地獲得應用的電量消耗。
步驟如下:
a. 拆開iOS設備的外殼,找到電池后面的電源針腳
b. 連接電源監控器的設備針腳
c. 運行應用
d. 測量電量消耗
該方案成本太高并不適合我們的測試工作。
3、軟件工具檢測
由于iOS系統的封閉性,獲取功耗數據只能通過Xcode自帶的Instruments工具實現,步驟如下:
1. 斷開iOS設備與Mac的連接(充電時測試功耗會導致數值不準確)
2. iOS設置選項->開發者選項->Logging->Start Recording
3. 進入需要測試電量的場景操作
4. 操作完成后進入開發者選項點擊Stop Recording
5. 將iOS設備和Mac連接
6. 打開Instruments,選擇Energy Log
7. 選擇File->Import Logged Data from Device
8. 保存的數據以時間軸輸出到Instrument面板
該方案作為性能測試的補充方案具有較高的權威性,但輸出的數據不直觀,用于功耗測試的效果并不理想。
4、使用Battery Life進行功耗測試
該APP無需額外費用,輸出結果直觀(可得到毫安數及百分比)準確,可以嘗試使用。
總結
- 上一篇: 阮一峰react demo代码研究的学习
- 下一篇: 阮一峰react demo代码研究的学习