學習 Android Battery 資訊
作為一個手機使用者,如果問大家最關心手機哪方面的效能,我想手機的待機時長一定會被提及,因為它決定了當前裝置還能執行多長時間,也就決定了你還可以無憂無慮地玩耍手機多長時間,大概不會有人願意每次出門的時候都要擔心自己的手機會不會一會兒就沒電了。每次有新手機上市的時候,手機的電池容量和待機時間都是必須要提到的要點之一,可見其重要程度。
從一個手機生產者的角度來看,一方面儘量加大其生產裝置的電池容量,另一方面儘量降低電池電量的消耗。由於受制於工業技術,電池容量不可能無限制地加大,所以如何在同樣的電池容量條件下減少電量消耗就成為了每個手機廠家必須關心的問題。
從一個手機程式設計者的角度來看,就要求在進行軟體程式設計時儘量減少對手機電量的消耗,甚至要在電量達到一定臨界值的時候關閉某些不重要功能,以維持手機的正常執行,因此在平時工作中,我們需要能夠及時瞭解當前手機的電池狀態以及特定應用對電池電量的消耗情況。
本文將利用兩個簡單的dumpsys
命令來獲取當前手機電池狀態和某段時間內電池電量使用情況統計,以幫助Android
程式設計者瞭解當前手機電池狀態並設計出低功耗的軟體。
2. 電池狀態
所謂“電池狀態”是指當前手機電池的基本狀態,包括當前電池是否處於充電狀態、當前電量、溫度等等,要想獲取這些狀態,只需通過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%,感興趣的同學可以自行學習。
3. 電量使用資訊
要想獲取電量使用資訊,可以使用adb shell dumpsys batterystats
,由於這個命令會顯示一段時間內所有的電量消耗過程以及各種分類統計,資訊量很大,建議在使用過程中可以把資訊單獨儲存在一個檔案中,再慢慢分析。
正是由於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
執行時間,這些資訊對分析應用耗電情況都非常有用。
4. 總結
本文講了Android
系統中和電池電量相關的dumpsys
命令,通過他們可以瞭解當前電池狀態和在一段時間內電池電量的消耗狀況,有助於開發者在程式開發過程中瞭解自己的應用程式對電量的影響,以時調整並設計出低功耗的應用程式。