本人只是 Android小菜一個,寫技術文檔只是爲了總結本身在最近學習到的知識,歷來不敢爲人師,若是裏面有些不正確的地方請你們盡情指出,謝謝!android
做爲一個手機用戶,若是問你們最關心手機哪方面的性能,我想手機的待機時長必定會被說起,由於它決定了當前設備還能運行多長時間,也就決定了你還能夠無憂無慮地玩耍手機多長時間,大概不會有人願意每次出門的時候都要擔憂本身的手機會不會一下子就沒電了。每次有新手機上市的時候,手機的電池容量和待機時間都是必需要提到的要點之一,可見其重要程度。shell
從一個手機生產者的角度來看,一方面儘可能加大其生產設備的電池容量,另外一方面儘可能下降電池電量的消耗。因爲受制於工業技術,電池容量不可能無限制地加大,因此如何在一樣的電池容量條件下減小電量消耗就成爲了每一個手機廠家必須關心的問題。bash
從一個手機程序設計者的角度來看,就要求在進行軟件程序設計時儘可能減小對手機電量的消耗,甚至要在電量達到必定臨界值的時候關閉某些不重要功能,以維持手機的正常運行,所以在平時工做中,咱們須要可以及時瞭解當前手機的電池狀態以及特定應用對電池電量的消耗狀況。less
本文將利用兩個簡單的dumpsys
命令來獲取當前手機電池狀態和某段時間內電池電量使用狀況統計,以幫助Android
程序設計者瞭解當前手機電池狀態並設計出低功耗的軟件。性能
所謂「電池狀態」是指當前手機電池的基本狀態,包括當前電池是否處於充電狀態、當前電量、溫度等等,要想獲取這些狀態,只需經過adb shell dumpsys battery
命令便可。學習
Current Battery Service state:
AC powered: false
USB powered: true
Wireless powered: false
Max charging current: 500000
Max charging voltage: 5000000
Charge counter: -3085480
status: 2
health: 2
present: true
level: 67
scale: 100
voltage: 4046
temperature: 230
technology: Li-ion
複製代碼
這個結果是小菜獲取到本身測試手機的電池狀態,每一項的含義也比較容易理解,這裏直接經過一個表格對其中比較重要信息加以說明:測試
字段 | 含義 | 取值 | 備註 |
---|---|---|---|
AC powered | 是否處理直充狀態 | true/false | |
USB powered | 是否處理 USB 充電狀態 | true/false | |
Wireless powered | 是否處於無線充電狀態 | true/false | |
Max charging current | 最大電流 | 未定,和具體設備有關。 | |
Max charging voltage | 最大電壓 | 未定,和具體設備有關。 | |
status | 電池狀態 | 1:unknown, 2:charging, 3:discharging, 4:not_charging, 5:full | 參考 BatteryManager |
health | 電池健康狀態 | 1:unknown, 2:good, 3:overheat, 4:dead, 5:over_voltage, 6:unspecified_failure, 7: cold | 參考 BatteryManager |
level | 電池電量百分比 | 0-scale | |
scale | 電池電量最大值 | 默認都是 100 | |
voltage | 當前電壓 | 0-max voltage | |
temperature | 當前溫度 | 未定 | 除以10獲得攝氏溫度 |
technology | 電池類型 | 未定 |
可使用
dumpsys set
方法來手動設置某些狀態信息,例如adb shell dumpsys battery set level 100
能夠把當前的電量設置爲 100%,感興趣的同窗能夠自行學習。ui
要想獲取電量使用信息,可使用adb shell dumpsys batterystats
,因爲這個命令會顯示一段時間內全部的電量消耗過程以及各類分類統計,信息量很大,建議在使用過程當中能夠把信息單獨保存在一個文件中,再慢慢分析。spa
正是因爲batterystats
可以顯示的信息不少,也有不一樣的分類組織方式,第一次接觸的同窗可能會感到很疑惑,面對大量信息一會兒不知道該如何下手,在這裏小菜就列舉一些我的認爲比較重要的「信息段」,但願能在實際工做中對你們有所幫助。設計
reset
到此次dumpsys
的時間內電量消耗過程:Battery History (6% used, 15KB used of 256KB, 53 strings using 4478):
0 (10) RESET:TIME: 2019-03-15-17-22-44
0 (2) 100 status=discharging health=good plug=none temp=270 volt=4344 charge=-3238 +running +wake_lock +screen phone_state=emergency phone_signal_strength=great brightness=dim +wifi_running +wifi top=u0a23:"com.android.launcher"
0 (2) 100 user=0:"0"
0 (3) 100 +wifi_scan phone_signal_strength=none userfg=0:"0"
+149ms (2) 100 -wifi_scan phone_signal_strength=great brightness=medium
+5s998ms (2) 100 -wake_lock -screen
+6s043ms (4) 100 volt=4319 charge=-3239 +wake_lock=1001:"RILJ" brightness=dark
+6s087ms (1) 100 -wake_lock
+6s579ms (2) 100 +wake_lock=1000:"startDream" wake_reason=0:"Abort:Pending Wakeup Sources: PowerManagerService.Broadcasts PowerManagerService.WakeLocks "
+6s884ms (1) 100 -wake_lock
+6s960ms (2) 100 +wake_lock=u0a16:"Wakeful StateMachine: GeofencerStateMachine"
+6s962ms (1) 100 -wake_lock
+6s997ms (2) 100 +wake_lock=u0a16:"NlpWakeLock"
+6s999ms (1) 100 -running -wake_lock
+37s150ms (2) 100 +running +wake_lock=1000:"*walarm*:WifiConnectivityManager Schedule Watchdog Timer" +wifi_scan wake_reason=0:"unknown"
+37s316ms (1) 100 -wake_lock -wifi_scan
+38s184ms (2) 100 +wake_lock=u0a16:"NlpWakeLock"
+38s195ms (1) 100 -wake_lock
+38s196ms (2) 100 +wake_lock=u0a16:"CMWakeLock"
+38s236ms (1) 100 -wake_lock
複製代碼
這段信息首先會顯示電池的一些基本狀態,例如是否充電、健康情況、溫度,電壓等等,而後再按照時間順序顯示整個電量的消耗過程,即在什麼時間因爲何種緣由耗電以及當時的電量狀況,對於開發者分析電量的消耗緣由有很是重大的意義。
+38s184ms (2) 100 +wake_lock=u0a16:"NlpWakeLock"
複製代碼
這個信息代表了在+38s184ms
時刻u0a16
因爲申請wake_lock
而產生了耗電行爲,當時的電量是100
.
Estimated power use (mAh):
Capacity: 3900, Computed drain: 730, actual drain: 156-195
Idle: 470 Excluded from smearing
Cell standby: 235 ( radio=235 ) Excluded from smearing
Uid u0a39: 8.64 ( cpu=0.187 sensor=8.45 ) Excluded from smearing
Uid 1000: 7.70 ( cpu=7.59 sensor=0.108 ) Excluded from smearing
Uid 0: 5.43 ( cpu=5.43 ) Excluded from smearing
Screen: 1.12 Excluded from smearing
Wifi: 0.982 ( cpu=0.236 wifi=0.746 ) Including smearing: 1.52 ( proportional=0.534 )
Uid 1001: 0.414 ( cpu=0.414 ) Excluded from smearing
Uid u0a16: 0.332 ( cpu=0.332 ) Including smearing: 0.513 ( proportional=0.181 )
Uid u0a99: 0.253 ( cpu=0.253 ) Including smearing: 0.390 ( proportional=0.138 )
Uid u0a119: 0.141 ( cpu=0.141 ) Including smearing: 0.218 ( proportional=0.0768 )
複製代碼
這段信息首先會顯示電池的容量以及這段時間內的消耗量,而後再顯示不一樣應用在這段時間內的耗電量以及耗電緣由。
Uid u0a39: 8.64 ( cpu=0.187 sensor=8.45 ) Excluded from smearing
複製代碼
這個信息代表Uid u0a39
在這段時間內消耗了 8.64毫安
電量,其中 cpu
消耗了 0.187毫安
,sensor
消耗了8.45毫安
。
u0a39:
Wake lock *alarm*: 16ms partial (2 times) max=10 realtime
Wake lock AudioMix realtime
Wake lock *vibrator* realtime
Wake lock show keyguard realtime
Wake lock Doze: 245ms partial (1 times) max=262 actual=262 realtime
Wake lock WindowManager realtime
Wake lock lockoutResetCallback realtime
TOTAL wake: 261ms blamed partial, 278ms actual partial realtime
Sensor 21: 1d 22h 57m 15s 564ms realtime (0 times)
Fg Service for: 1d 22h 57m 15s 564ms
Total running: 1d 22h 57m 15s 564ms
Total cpu time: u=3s 490ms s=730ms
Proc com.android.systemui:
CPU: 21s 110ms usr + 4s 860ms krn ; 0ms fg
Apk com.android.systemui:
Wakeup alarm *walarm*:com.android.systemui.newday: 2 times
Service com.android.systemui.doze.DozeService:
Created for: 0ms uptime
Starts: 0, launches: 2
複製代碼
這個信息代表u0a39
應用在存在期間wake_lock
和sensor
分別運行了多長時間及打開次數和cpu
運行時間,這些信息對分析應用耗電狀況都很是有用。
本文講了Android
系統中和電池電量相關的dumpsys
命令,經過他們能夠了解當前電池狀態和在一段時間內電池電量的消耗情況,有助於開發者在程序開發過程當中瞭解本身的應用程序對電量的影響,以時調整並設計出低功耗的應用程序。