1 耗電原因
- app消耗電量的體現(xiàn)寇仓,為以下各模塊的耗電
屏幕、CPU揪阿、相機(jī)、閃光燈济欢、音頻悉患、視頻、藍(lán)牙泣港、modem暂殖、wifi、gps
- 單位耗電量排序
相機(jī)(平均1152mAh) > modem(最高604mAh) > wifi(發(fā)數(shù)據(jù)370mAh) > CPU(最高頻率290mAh) > 屏幕(最亮240mAh) > 音頻(75mAh) > 視頻(50mAh) > GPS(49mAh) > 藍(lán)牙(8mAh)
2 日志內(nèi)容
- 導(dǎo)出日志的命令
adb shell dumpsys batterystats > batterystats.txt
- 日志片段
Battery History (2% used, 11KB used of 512KB, 102 strings using 9638):
0 (10) RESET:TIME: 2019-02-18-15-49-33
0 (1) 034 status=charging health=good plug=usb temp=330 volt=3768 charge=948 +running +wake_lock +mobile_radio +screen +plugged data_conn=lte phone_signal_strength=excellent brightness=medium +wifi_running +wifi +usb_data wifi_signal_strength=4 wifi_suppl=disconn gps_signal_quality=good
0 (2) 034 proc=1000:"com.xiaomi.joyose"
0 (2) 034 proc=1000:"com.goodix.fingerprint"
0 (2) 034 proc=u0a150:"com.tencent.mobileqq"
0 (2) 034 proc=u0a211:"com.miui.systemAdSolution"
0 (2) 034 proc=1001:"com.android.phone"
0 (2) 034 proc=1000:"com.miui.contentcatcher"
0 (2) 034 proc=u0a196:"com.sohu.inputmethod.sogou"
0 (2) 034 proc=u0a3:"com.lbe.security.miui"
0 (2) 034 proc=1000:"com.miui.wmsvc"
-
整個(gè)日志的結(jié)構(gòu)大致如下
image.png
* Battery History: 耗電統(tǒng)計(jì)的歷史記錄当纱,每一條記錄以HistoryItem的形* 式存在
* Per-PID Stats: 每個(gè)進(jìn)程喚醒工作的時(shí)間
* Discharge step durations: 每掉一隔電的時(shí)間點(diǎn)和設(shè)備的狀態(tài)
* Daily stats: 以天為單位展示每掉一隔電的時(shí)間點(diǎn)和設(shè)備狀態(tài)
* Statistics since last charge: 從上次充電以來的統(tǒng)計(jì)詳情呛每,包含很多子板塊
* Cellular Statistics: 移動(dòng)數(shù)據(jù)網(wǎng)絡(luò)狀態(tài)和使用情況
* Wifi Statistics: WIFI的網(wǎng)絡(luò)狀態(tài)和使用情況
* Bluetooth: 藍(lán)牙在不同工作狀態(tài)下的使用情況
* Estimated power use (mAh): 近似計(jì)算出的各個(gè)用戶(uid)的耗電量,一個(gè)APK通常對應(yīng)到一個(gè)用戶坡氯,當(dāng)然晨横,也有多個(gè)APK共享一個(gè)用戶的情況
2-1 Battery History
batterystats會被動(dòng)(push)或主動(dòng)(pull)的獲取電量統(tǒng)計(jì)信息,每一次都會將獲取到的信息記錄下來箫柳,每一條信息會以HistoryItem對象的形式保存在一個(gè)緩沖區(qū)手形。整個(gè)Battery History的日志結(jié)構(gòu)如下圖所示:
HistoryItem可以理解為一次記錄耗電變化的動(dòng)作,因此滞时,它被設(shè)計(jì)為命令的方式叁幢,每生成一個(gè)HistoryItem滤灯,就相當(dāng)于發(fā)起了一次耗電統(tǒng)計(jì)的命令坪稽。HistoryItem詳細(xì)的描述了在某一個(gè)時(shí)刻,影響耗電的各因素所在的狀態(tài)鳞骤,是分析功耗問題重要的依據(jù)窒百。隨著待機(jī)時(shí)間的延長,HistoryItem對象的數(shù)量就越多豫尽,因此篙梢,整個(gè)電量統(tǒng)計(jì)日志可能很大篇幅都被Battery History占據(jù)了,下面就詳細(xì)地剖析其中意義美旧。
- 第一行
Battery History (2% used, 11KB used of 512KB, 102 strings using 9638):
用于存儲HistoryItem的緩存并非無限大渤滞,Android默認(rèn)為512KB,此處使用了11KB榴嗅,所以使用率為2%妄呕。另外,因?yàn)槿罩局蓄l繁出現(xiàn)的也是一些固定的字符串嗽测,為了節(jié)省空間绪励,統(tǒng)計(jì)信息都是以極簡的格式存儲,所以唠粥,此處還有一個(gè)字符串的緩存疏魏。
- 第二行
0 (10) RESET:TIME: 2019-02-18-15-49-33
這是第一條HistoryItem記錄: RESET命令。RESET表示重新開始一個(gè)時(shí)間段的電量統(tǒng)計(jì)晤愧。為什么需要RESET呢? 因?yàn)樵诮y(tǒng)計(jì)之前可能是充電狀態(tài), 停止充電后才有統(tǒng)計(jì)的必要大莫。
- 0: 表示當(dāng)前開始統(tǒng)計(jì)的起點(diǎn)時(shí)間
- (10): 從緩存中讀取的子節(jié)數(shù)
- RESET命令,該處可能出現(xiàn)的另外命令還有START(開機(jī)時(shí)的統(tǒng)計(jì)記錄)官份,SHUTDOWN(關(guān)機(jī)時(shí)的統(tǒng)計(jì)記錄)葵硕,OVERFLOW(緩沖區(qū)溢出的記錄)眉抬。 RESET和START命令會打印出當(dāng)前的時(shí)間,即TIME: 2019-02-18-15-49-33
- 第三行
0 (1) 034 status=charging health=good plug=usb temp=330 volt=3768 charge=948 +running +wake_lock +mobile_radio +screen +plugged data_conn=lte phone_signal_strength=excellent brightness=medium +wifi_running +wifi +usb_data wifi_signal_strength=4 wifi_suppl=disconn gps_signal_quality=good
- 100 當(dāng)前電量百分值懈凹,隨著時(shí)間的推移蜀变,這個(gè)值會逐漸減少
- status: 充電狀態(tài)(unknown未知狀態(tài),charging充電狀態(tài)介评,discharging放電狀態(tài)库北,not-charging沒有充電,full已充滿)
- health: 電池狀態(tài)(unknown未知狀態(tài)们陆,good正常寒瓦,overheat過熱,dead已壞坪仇,over-voltage電壓過高杂腰,cold過冷)
- plug: 插拔連接狀態(tài)(none未插拔,ac交流電椅文,usb數(shù)據(jù)線喂很,wireless無線連接)
- temp: 電池溫度
- volt: 電池電壓
- state: 主動(dòng)記錄的影響耗電的硬件工作狀態(tài),這些狀態(tài)從字面意思就能理解
- 部分狀態(tài)前面會帶上+或者-皆刺,+表示進(jìn)入狀態(tài)少辣,-表示離開狀態(tài),譬如: +running表示CPU進(jìn)入運(yùn)行狀態(tài)羡蛾,-wakelock表示釋放鎖
- 部分狀態(tài)設(shè)置了狀態(tài)值漓帅。譬如: phone_signal_strength=great表示當(dāng)前手機(jī)信號很強(qiáng)
- wakeup_reason: 如果存在,則會打印喚醒的理由
- event: 被動(dòng)通知的影響耗電的事件痴怨,event會帶上事件源的uid
- 部分事件前面會帶上+或者-忙干,+表示進(jìn)入事件,-表示離開事件浪藻,譬如: +top=u0a70:”com.test.mygame”表示當(dāng)前進(jìn)入顯示的界面為com.test.mygame捐迫,事件源的uid為u0a70
- 所有事件都有一個(gè)描述值,即=右邊的內(nèi)容
- 第四珠移、五行
0 (2) 034 proc=1000:"com.xiaomi.joyose"
0 (2) 034 proc=1000:"com.goodix.fingerprint"
這是第三條和第四條HistoryItem記錄弓乙,分別記錄了兩個(gè)事件(event),Android系統(tǒng)進(jìn)程啟動(dòng)完成時(shí)會通知batterystats
- 第六钧惧、七行暇韧。。浓瞪。
0 (2) 100 alarm=u0a165:"*walarm*:com.alipay.mobile.healthcommon.broadcast.TIME_TO_COUNT_STEP"
+3ms (2) 100 stats=0:"screen-state"
+10ms (2) 100 +camera +wake_lock_in=1000:"*vibrator*"
+17ms (2) 100 +alarm=1000:"*alarm*:android.intent.action.TIME_TICK"
+19ms (2) 100 +wake_lock_in=1000:"*alarm*:android.intent.action.TIME_TICK"
+21ms (2) 100 +wake_lock_in=1001:"*telephony-radio*"
+23ms (2) 100 +wake_lock_in=u0a140:"*telephony-radio*"
+23ms (2) 100 +wake_lock_in=u0a149:"*telephony-radio*"
+24ms (2) 100 -wake_lock_in=1001:"*telephony-radio*"
+27ms (2) 100 -wake_lock_in=u0a140:"*telephony-radio*"
+27ms (2) 100 +wifi_scan -wake_lock_in=u0a149:"*telephony-radio*"
+52ms (2) 100 +wake_lock_in=1027:"NfcService:mRoutingWakeLock"
+73ms (3) 100 +audio -wake_lock_in=1000:"*vibrator*"
......
剩下的HistoryItem記錄懈玻,用時(shí)間序記錄了耗電過程,整個(gè)過程其實(shí)就是硬件狀態(tài)和耗電事件交替發(fā)生變化乾颁。隨著時(shí)間的推移涂乌,系統(tǒng)在睡眠中會被喚醒艺栈,CPU開始運(yùn)轉(zhuǎn),camera喚醒湾盒,wifi掃描湿右,這些都直接反映到了上述日志中。
2-2 Per-PID Stats
每個(gè)進(jìn)程wakelock的持鎖時(shí)間
Per-PID Stats:
PID 0 wake time: +2s728ms
PID 1333 wake time: +8s574ms
PID 1923 wake time: 0
PID 1333 wake time: +6ms
PID 2088 wake time: +50ms
PID 2096 wake time: +7s369ms
PID 3769 wake time: +87ms
PID 0 wake time: +12s857ms
PID 1333 wake time: +2ms
日志中會看到一些重復(fù)的PID罚勾,因?yàn)檫@份日志是按照uid來歸類的(但并沒有把uid打印出來)毅人,表達(dá)的是一個(gè)uid關(guān)聯(lián)到的所有進(jìn)程持有wakelock的時(shí)間。
2-3 Discharge step durations:
每隔電的掉電時(shí)間和設(shè)備狀態(tài)
Discharge step durations:
#0: +1m42s403ms to 97 (screen-on, power-save-off, device-idle-off)
#1: +1m21s919ms to 98 (screen-on, power-save-off, device-idle-off)\
第#0條記錄尖殃,表示用了1分42秒的時(shí)間丈莺,電量從98%已經(jīng)掉到97%,手機(jī)此時(shí)的狀態(tài)是:不在省電狀態(tài)(power-save-off)送丰,也不在空閑狀態(tài)(device-idle-off)缔俄。 當(dāng)然,在掉電的過程中器躏,手機(jī)還可能處于其他狀態(tài):
- screen-on/scree-off:屏幕是否點(diǎn)亮俐载。如果我們發(fā)現(xiàn)日志中,screen-on這個(gè)狀態(tài)高頻出現(xiàn)邀桑,那說明手機(jī)處于比較耗電的狀態(tài)中瞎疼。
- power-save-on/power-save-off:是否開啟省電模式科乎。在設(shè)置中壁畸,可以打開手機(jī)進(jìn)入省電模式的開關(guān),在省電狀態(tài)下茅茂,手機(jī)會降低運(yùn)行性能捏萍、禁止一些后臺服務(wù)(譬如收郵件、定位等)空闲。默認(rèn)情況下令杈,該開關(guān)是關(guān)閉的,既手機(jī)處于power-save-off的狀態(tài)碴倾。
- device-idle-on/device-idle-off:是否處于空閑狀態(tài)逗噩。從Android M(6.0)開始,就引入了Doze模式跌榔,簡單來說异雁,就是手機(jī)滿足一定的條件(滅屏、靜止僧须、沒有充電)時(shí)纲刀,就會進(jìn)入到一種休眠狀態(tài)(IDLE),在這種狀態(tài)下担平,所有CPU示绊、網(wǎng)絡(luò)锭部、外設(shè)的使用請求都會被擱置。在深度休眠一段時(shí)間后面褐,手機(jī)又會被喚醒拌禾,留出一小段窗口期(IDLE_MAINTAINESS),執(zhí)行之前擱置的請求展哭。
2-4 Daily stats
以天為單位蹋砚,展示每隔電的掉電時(shí)間和設(shè)備狀態(tài)。這一部分日志的含義與上面相同摄杂,僅僅加了一個(gè)分類坝咐,不再贅述。
2-5 Statistics since last charge
自從上次充電以來的電量統(tǒng)計(jì)析恢,既最近一次拔下充電線墨坚,僅僅使用手機(jī)電池的統(tǒng)計(jì)。這一部分日志是重點(diǎn)映挂,包含很多方面的信息泽篮。
我們先來看整個(gè)耗電的統(tǒng)計(jì)概覽:
Statistics since last charge:
System starts: 0, currently on battery: false
Estimated battery capacity: 2679 mAh
Min learned battery capacity: 2863 mAh
Max learned battery capacity: 2863 mAh
Time on battery: 5m 45s 235ms (99.2%) realtime, 5m 45s 235ms (100.0%) uptime
Time on battery screen off: 0ms (0.0%) realtime, 0ms (0.0%) uptime
Time on battery screen doze: 0ms (0.0%)
Total run time: 5m 47s 923ms realtime, 5m 47s 922ms uptime
Discharge: 62.7 mAh
Screen off discharge: 0 mAh
Screen doze discharge: 0 mAh
Screen on discharge: 62.7 mAh
Device light doze discharge: 0 mAh
Device deep doze discharge: 0 mAh
Start clock time: 2019-02-19-15-51-04
Screen on: 5m 45s 235ms (100.0%) 0x, Interactive: 5m 45s 235ms (100.0%)
Screen brightnesses:
dim 5m 45s 235ms (100.0%)
Connectivity changes: 3
Total full wakelock time: 2s 272ms
- System starts:手機(jī)重啟次數(shù),currently on battery:當(dāng)前是否正在使用電池
- Estimated battery capacity:電池總?cè)萘?/li>
- Time on battery:電池使用時(shí)間柑船。這個(gè)有兩個(gè)時(shí)間:
- realtime:正常流逝的時(shí)間帽撑,通常把這個(gè)時(shí)間叫做“墻上時(shí)間(walltime)”,就像掛在墻上的時(shí)鐘一樣鞍时,走過了一小時(shí)就是小時(shí)
- uptime:CPU工作的時(shí)間亏拉。“墻上時(shí)間”經(jīng)過一小時(shí)逆巍,但CPU可能就工作了一分鐘及塘,其他時(shí)間CPU都在休眠
這兩個(gè)時(shí)間結(jié)合在一起,就能夠知道休眠率: (realtime-uptime)/realtime锐极,既手機(jī)休眠的時(shí)間占整個(gè)待機(jī)時(shí)間的比率笙僚。休眠率越高,就表明越省電灵再。
- Time on battery screen off:在滅屏狀態(tài)下肋层,電池的使用時(shí)間。通常翎迁,在滅屏?xí)r栋猖,我們希望手機(jī)可以快速進(jìn)入休眠狀態(tài),所以鸳兽,這里計(jì)算出的休眠率使我們考察耗電問題的重要指標(biāo)
- Time on battery screen doze:在Doze狀態(tài)下掂铐,電池的使用時(shí)間
- Total run time:總共的電池使用時(shí)間
- Discharge:放電量,既總共使用的電量
- Screen off discharge:滅屏狀態(tài)下的放電量
- Screen doze discharge:Doze狀態(tài)下的放電量
- Screen on discharge:亮屏狀態(tài)下的放電量
- Start clock time:開始電量統(tǒng)計(jì)的時(shí)刻
- Screen brightnesses:屏幕在不同亮度下的時(shí)間
- Total partial wakelock time:應(yīng)用層持有wakelock的總時(shí)間
2-5-1 Estimated power use
計(jì)算得到,不同硬件和應(yīng)用的耗電情況排行
Estimated power use (mAh):
Capacity: 3400, Computed drain: 44.9, actual drain: 68.0-102
Unaccounted: 23.1 ( ) Including smearing: 0 ( ) Excluded from smearing
Screen: 19.6 Excluded from smearing
Uid u0a124: 16.0 ( cpu=4.38 radio=11.6 wifi=0.00580 gps=0.00936 sensor=0.000149 ) Including smearing: 18.0 ( proportional=1.94 )
Uid 1000: 4.02 ( cpu=3.85 radio=0.00146 wifi=0.00575 sensor=0.0000303 camera=0.158 ) Excluded from smearing
Uid 0: 2.02 ( cpu=1.81 radio=0.206 wifi=0.00166 ) Excluded from smearing
Idle: 0.467 Excluded from smearing
Uid u0a18: 0.304 ( cpu=0.113 radio=0.191 ) Including smearing: 0.341 ( proportional=0.0369 )
Uid 1052: 0.300 ( cpu=0.00173 radio=0.299 ) Excluded from smearing
Wifi: 0.299 ( cpu=0.0266 wifi=0.272 ) Including smearing: 0.335 ( proportional=0.0363 )
Cell standby: 0.291 ( radio=0.291 ) Excluded from smearing
Uid 1051: 0.256 ( radio=0.256 ) Excluded from smearing
- Capacity: 電池容量, Computed drain: 計(jì)算得到的耗電量, actual drain: 實(shí)際耗電量全陨。本例中爆班,計(jì)算得到的耗電量(44.9mAh)竟然是實(shí)際耗電量(68.0~102mAh)的10幾倍,進(jìn)一步說明耗電統(tǒng)計(jì)只是一個(gè)近似計(jì)算
- Cell standby:射頻待機(jī)的耗電量辱姨。正是由于這里計(jì)算出了26122mAh的耗電量柿菩,導(dǎo)致總體計(jì)算值出現(xiàn)了很大的偏差。為什么會計(jì)算出這么大的值呢雨涛?要么是單位電流值配置出錯(cuò)了枢舶,要么是使用時(shí)間計(jì)算出錯(cuò)了
- Bluetooth:藍(lán)牙使用的耗電量。
- Uid XXX:一個(gè)Uid的耗電量替久,可以近似理解為一個(gè)應(yīng)用的耗電量凉泄。在高版本的日志中,會再進(jìn)行細(xì)分蚯根,括號中cpu=4.38 radio=11.6 wifi=0.00580 gps=0.00936 sensor=0.000149后众,就表明一個(gè)應(yīng)用使用cpu的電量是4.38mA,使用傳感器的耗電量是0.000149mAh等
這一部分日志是按照耗電量的從大到小排序的颅拦,通常我們只需關(guān)注頭部耗電占比嚴(yán)重的模塊