前言善玫,電量消耗的計算與統(tǒng)計是一件麻煩而且矛盾的事情,記錄電量消耗本身也是一個費電量的事情密强。唯一可行的方案是使用第三方監(jiān)測電量的設(shè)備蝌焚,這樣才能夠獲取到真實的電量消耗。
工具:Battery Historian, 是一款由Google提供的Android系統(tǒng)電量分析工具.使用Battery Historian需要搭建GO開發(fā)環(huán)境誓斥。需要更加直觀的觀察電量數(shù)據(jù)只洒,還需要搭建Python開發(fā)環(huán)境。(參考文獻:http://www.it610.com/article/5231420.htm)
通過Battery Historian獲取了手機電量總情況后劳坑,研究手機電量使用情況毕谴,并找出項目對手機電量的使用情況,分析電量使用情況距芬,并研究項目電量優(yōu)化的策略涝开。
主要指標解釋:
橫坐標:時間周期,60秒為一個周期框仔;
battery_level: 電池的電量情況舀武;
plugged: 充電狀態(tài)及充電的時長;
screen: 屏幕是否點亮及時間
top: 該欄顯示當前時刻哪個app處于最上層,就是當前手機運行的app离斩,用來判斷某個app對手機電量的影響银舱,這樣也能判斷出該app的耗電量信息。
wake_lock*:??wake_lock 該屬性是記錄wake_lock模塊的工作時間跛梗。是否有停止的時候等寻馏。
running: 界面的狀態(tài),主要判斷是否處于idle的狀態(tài)核偿。用來判斷無操作狀態(tài)下電量的消耗诚欠。
wake_lock_in: wake_lock有不同的組件,這個地方記錄在某一個時刻漾岳,有哪些部件開始工作轰绵,以及工作的時間。
data_conn:數(shù)據(jù)連接方式的改變尼荆,上面的edge是說明采用的gprs的方式連接網(wǎng)絡(luò)的左腔。此數(shù)據(jù)可以看出手機是使用2g,3g耀找,4g還是wifi進行數(shù)據(jù)交換的翔悠。這一欄可以看出不同的連接方式對電量使用的影響。
status:電池狀態(tài)信息野芒,有充電蓄愁,放電,未充電狞悲,已充滿撮抓,未知等不同狀態(tài)。這一欄記錄了電池狀態(tài)的改變信息摇锋。
phone_signal_strength:手機信號狀態(tài)的改變丹拯。這一欄記錄手機信號的強弱變化圖,依次來判斷手機信號對電量的影響荸恕。
health:電池健康狀態(tài)的信息乖酬,這個信息一定程度上反映了這塊電池使用了多長時間。這一欄記錄電池狀態(tài)在何時發(fā)生改變融求。
plug:充電方式咬像,usb或者插座,以及顯示連接的時間生宛。這一欄顯示了不同的充電方式對電量使用的影響县昂。
補充:之前僅僅為項目電量情況進行一次系統(tǒng)診斷,但用戶使用過程中出現(xiàn)的異常電量使用情況無法被統(tǒng)計與分析陷舅。所以對用戶使用項目的持續(xù)診斷與分析是至關(guān)重要的倒彰。
為持續(xù)診斷設(shè)計策略時,發(fā)現(xiàn)新的問題:與應(yīng)用的正常行為相比莱睁,持續(xù)監(jiān)控電池電量會消耗更多電量待讳。因此,比較合適的做法是只監(jiān)控電池電量的顯著變化(尤其是在設(shè)備進入或結(jié)束低電量狀態(tài)的情況下)仰剿。比如 用戶容易感知到的電量變化節(jié)點:低電量狀態(tài)耙箍,手機電量過低自動關(guān)機,電池溫度等異常狀態(tài)下進行監(jiān)控并將數(shù)據(jù)上傳服務(wù)器酥馍。再在服務(wù)器中進行統(tǒng)計分析后辩昆,通知手機做出電量補救措施。(持續(xù)診斷操作步驟相當耗時旨袒,故可選)
通過手機廣播來接受到手機電池電量的顯著變化:
// BatteryManager.BATTERY_STATUS_CHARGING 表示是充電狀態(tài)
// BatteryManager.BATTERY_STATUS_DISCHARGING 放電中
// BatteryManager.BATTERY_STATUS_NOT_CHARGING 未充電
// BatteryManager.BATTERY_STATUS_FULL 電池滿
//充電類型 BatteryManager.BATTERY_PLUGGED_AC 表示是充電器汁针,不是這個值,表示是 USB
//電池健康情況砚尽,返回也是一個數(shù)字
//BatteryManager.BATTERY_HEALTH_GOOD 良好
//BatteryManager.BATTERY_HEALTH_OVERHEAT 過熱
//BatteryManager.BATTERY_HEALTH_DEAD 沒電
//BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE 過電壓
//BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE 未知錯誤
電量優(yōu)化建議:?
第一:項目存在大量的輪詢請求接口施无。應(yīng)該將其整合起來,減少CPU的消耗必孤。
?第二(可選):項目的直播或音頻是電量消耗大戶猾骡,可判斷用戶是否處于充電狀態(tài)瑞躺,再獲取用戶電量,在某個臨界點時兴想,降低直播碼率幢哨,提高觀看直播時間。?
第三:清單文件application標簽下keepScreenOn保持屏幕常亮模式不夠完善嫂便,導致用戶長時間無操作情況下捞镰,屏幕長時間 保持常亮。建議修改模式為:用戶5分鐘未操作狀態(tài)下毙替,屏幕變暗且屏幕不關(guān)閉岸售。滿足屏幕處于開啟狀態(tài)下節(jié)約用電。?
第四(可選):項目存在大量的圖片展示厂画,圖片加載時會消耗大量的流量與電量凸丸。方案一:可判斷用戶是否處于充電 狀態(tài),再獲取用戶電量袱院,在某個臨界點時甲雅,降低加載圖片碼率,提高操作時間坑填。?
第五:項目也有一些上傳下載操作進行著抛人,可采用高效下載策略,做到批量執(zhí)行網(wǎng)絡(luò)請求脐瑰,盡量避免頻繁的間隔網(wǎng)絡(luò)請 求妖枚。判斷哪些任務(wù)是不緊急的,可以交給Job Scheduler來處理苍在,Job Scheduler集中處理收到的任務(wù)绝页,選擇合適的時間,合適的網(wǎng) 絡(luò)寂恬,再一起進行執(zhí)行续誉。
結(jié)語: 測試電量與優(yōu)化是一條漫長的道路,也希望大家有“把電量當成干糧”的意識初肉,這樣你所做的app也會更加優(yōu)雅酷鸦。