理解 Android Battery 信息

4,402 阅读7分钟

本人只是 Android小菜一个,写技术文档只是为了总结自己在最近学习到的知识,从来不敢为人师,如果里面有些不正确的地方请大家尽情指出,谢谢!

1. 概述

作为一个手机用户,如果问大家最关心手机哪方面的性能,我想手机的待机时长一定会被提及,因为它决定了当前设备还能运行多长时间,也就决定了你还可以无忧无虑地玩耍手机多长时间,大概不会有人愿意每次出门的时候都要担心自己的手机会不会一会儿就没电了。每次有新手机上市的时候,手机的电池容量和待机时间都是必须要提到的要点之一,可见其重要程度。

从一个手机生产者的角度来看,一方面尽量加大其生产设备的电池容量,另一方面尽量降低电池电量的消耗。由于受制于工业技术,电池容量不可能无限制地加大,所以如何在同样的电池容量条件下减少电量消耗就成为了每个手机厂家必须关心的问题。

从一个手机程序设计者的角度来看,就要求在进行软件程序设计时尽量减少对手机电量的消耗,甚至要在电量达到一定临界值的时候关闭某些不重要功能,以维持手机的正常运行,因此在平时工作中,我们需要能够及时了解当前手机的电池状态以及特定应用对电池电量的消耗情况。

本文将利用两个简单的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_locksensor分别运行了多长时间及打开次数和cpu运行时间,这些信息对分析应用耗电情况都非常有用。

4. 总结

本文讲了Android系统中和电池电量相关的dumpsys命令,通过他们可以了解当前电池状态和在一段时间内电池电量的消耗状况,有助于开发者在程序开发过程中了解自己的应用程序对电量的影响,以时调整并设计出低功耗的应用程序。