Android 常用命令和工具解析之Battery Historian

一、Battery Historian

Batterystats是包含在 Android 框架中的一种工具,用于收集设备上的电池数据。您可以使用adb bugreport命令抓取日志,将收集的电池数据转储到开发机器,并生成可使用 Battery Historian 分析的报告。Battery Historian 会将报告从 Batterystats 转换为可在浏览器中查看的 HTML 可视化内容。适合的场景:

  • 显示进程从什么位置以及通过何种方式消耗电池电量
  • 识别系统为了延长电池续航时间可能会延迟甚至移除应用中的哪些任务。

当设备在使用电池的时候,它可以使开发者们看到系统级和应用级事件图表,在图表时间轴上可以缩放和平移,能够直观的看到自上一次充满电到现在设备电池的统计汇总信息,它可以选中一个应用程序来检查该应用影响电池电量的一些参数,并且可以对比两个bugreport文件信息分析,并对其电池关键区别点做高亮显示。

Battery Historian的安装可以参考:https://download.csdn.net/blog/column/11547800/108662887

其他参考:Android性能优化系列之电量优化_android 电量优化-CSDN博客

1、Show BAR图形化界面

但是通常企业里面基本上都搭建了,所以直接使用解析bugreport文件就行了,解析后主界面如下:

  • 右上角通常选择Battery Level,即中间会出现一根黑线,那根黑线就是剩余电量
  • 左侧纵轴为一些比较关键的字段,把鼠标移动到上面会自动显示相关说明
  • 底部横轴为时间线,可以通过鼠标轮滑来放大和缩小,且时间比较精准

  • 每个字段都来自bugreport里面的那一段日志?可以讲鼠标放到旁边查看详细介绍

CPU running/Reboot

CPU running信息来源于日志Battery History。

CPU running表示设备上 CPU 处于活动状态(非休眠状态)的时间。这是指 CPU 在处理各种任务时所花费的时间,包括应用程序的执行、系统服务的处理以及其他系统任务。CPU running 时间通常用于衡量设备在特定时间段内的活动水平,以便评估设备的能耗情况。

如上图表示CPU持续运行了45小时,所以这里的CPU running还并不像性能分析里面的轮询片段

Reboot表示设备是否处于关机状态,如果为on表示此时关机或者休眠,注意这里不是reboot的这个事件,他和CPU running刚好出现反比,如果它为on,其他字段基本上都是空的,如下截图

App Processor wakeup

App Processor wakeup 信息来源于日志Battery History。

在 Battery Historian 中,App Processor wakeup 表示应用处理器(通常是设备上的主 CPU)从睡眠状态唤醒的次数。当应用处理器从睡眠状态唤醒时,它需要消耗额外的电量来执行任务,这可能会导致设备的电池消耗增加。

App Processor wakeup 是一个重要的指标,用于衡量应用程序或系统活动导致应用处理器频繁唤醒的情况。频繁的唤醒事件可能表明有一些应用程序或系统服务在不必要地唤醒设备,从而导致电池消耗增加。这可能是由于应用程序执行了过多的后台任务、使用了不当的定时器或触发器,或者存在其他导致设备频繁唤醒的问题。

个人理解此字段表示应用进程被唤醒的次数,当然这里的应用进程可能是前台进程也可能是后台进程。

如上图表示此时间点wisemine应用被唤醒一次,但是注意如果缩短时间轴,他会把相近的几次组合,即如上三个点表示三次被唤醒,合在一起如下:

Bugreport保存此字段的原理可以参考BugReport中的App Processor wakeup字段意义-CSDN博客

Kernel only uptime

Kernel only uptime 信息来源于日志Generated。

在 Battery Historian 中,Kernel only uptime 表示设备的内核(Kernel)仅处于运行状态而不是睡眠状态的时间。内核是操作系统的核心组件,负责管理系统资源、处理任务调度、驱动设备等。当内核处于运行状态时,设备通常会消耗更多的电量。

Kernel only uptime 是一个重要的指标,用于了解设备内核在特定时间段内的活动水平。较长的 Kernel only uptime 可能表明设备的内核在处理各种系统任务时一直处于活动状态,这可能会导致额外的能源消耗,影响设备的电池寿命。

通常可以通过此字段来判断是否底层导致。

Userspace wakelock 

Userspace wakelock记录Android 中PowerManagerService 的wake_lock 模块的工作时间(有任务需要唤醒CPU 时,就会开启Userspace wakelock)。其实就是PMS的应用锁申请状态。

Userspace wakelock信息来源于日志Battery History,在bugreport里面打印如下:

#dump PMS服务的Wake Lock日志
Wake Lock Log
  04-14 09:10:14.271 - 1001 - ACQ RILJ_ACK_WL (partial)
  04-14 09:10:14.473 - 1001 - REL RILJ_ACK_WL
  04-14 09:10:18.721 - 1000 - ACQ *alarm* (partial)
  04-14 09:10:18.763 - 1000 - REL *alarm*
  04-14 09:10:18.901 - 1000 - ACQ NetworkStats (partial)
  04-14 09:10:18.918 - 1000 - REL NetworkStats
  04-14 09:10:22.333 - 1000 - ACQ NetworkStats (partial)
  ..........
#dump batterystats服务
DUMP OF SERVICE batterystats:
Service host process PID: 2256
Threads in use: 0/32
Client PIDs: 1682, 23603, 12938, 4270, 11370, 11100, 3244, 1511, 5321, 3364, 1273, 3271, 4942, 2906, 776
Battery History (48% used, 1985KB used of 4096KB, 1490 strings using 86KB):
                    0 (14) RESET:TIME: 2025-04-11-18-00-11
                    0 (2) 083 c2981a21 tmpwhitelist=u0a184:"sync by top app"
    #重置Battery历史记录
                +86ms (2) 083 c2981a21 stats=0:"reset"  
             +2s873ms (2) 083 c2981a21 +wake_lock_in=1000:"NetworkStats"
             +2s887ms (2) 083 c2981a21 -wake_lock_in=1000:"NetworkStats"
             +4s537ms (2) 083 ca981a21 +wake_lock_in=1001:"*telephony-radio*"
    #记录的事件可能多种,不仅仅是wake_lock_in
    #通用格式是 时间错(与重置reset之间的差异) +  事件  +详情
    +2d15h57m34s031ms (2) 046 c4981a21 +wake_lock_in=1001:"*telephony-radio*"
    +2d15h57m34s031ms (2) 046 c4981a21 stats=0:"dump"
    +2d15h57m34s032ms (2) 046 c4981a21 -wake_lock_in=1001:"*telephony-radio*"

如上这里的total duration计算不准,后面发现这里的值为action event times里面记录的所有时间段相减,得到的一个总值,因此第如果后面记录的时间段太多,那么total duration就会得到一个很大的值

Long Wakelocks

Long Wakelocks记录长时间斥锁wake_lock 的进程。

Screen

通过监视 Battery Historian 中的 "Screen" 数据,用户可以了解设备屏幕的使用情况,包括屏幕开启时长、亮度变化等信息。这有助于用户评估自己的屏幕使用习惯,以及了解哪些应用程序或活动可能导致屏幕开启时间过长,从而影响设备的电池寿命。

如上图红色表示屏幕是亮起来的,白色表示屏幕没有亮起来,放大时间轴之后能够清晰的得到屏幕亮起来的原因和时长:

  • Top app

在 Battery Historian 中,"Top app" 表示在特定时间段内消耗最多电量的应用程序。这个指标可以帮助用户和开发人员了解哪些应用程序在设备上消耗了大量的电量,从而帮助他们识别可能导致电池耗尽的应用程序或活动。

通过监视 Battery Historian 中的 "Top app" 数据,用户可以查看哪些应用程序在特定时间段内使用了大量的电量。这有助于用户优化其应用程序使用习惯,可能会减少对电量消耗较高的应用程序的使用,或者寻找更节能的替代方案。

如上图表示在此时间点最活跃的几个应用,按照持续时间排名,放大时间轴会发现,这里同样会被合并:

PS:此项如果以点的形式表现通常没有太大的意义,可能是待机状态下突然亮屏,或者某个应用突然启动起来;但是如果持续时间很长,就能够证实对应的应用可能存在异常,因为持续很长时间在持续耗电。

  • Foreground process

在 Battery Historian 中,"Foreground process" 表示在设备上处于前台运行状态的进程或应用程序。前台进程通常是用户当前正在与之交互的应用程序,因为用户正在使用这些应用程序,它们通常会占用更多的系统资源,包括 CPU、内存和电量。

这个是指的前台进程,表示当前在设备上处于前台运行状态的进程或应用程序。这些是用户当前正在与之交互的应用程序,它们通常会占用更多的系统资源和电量。但是top app不一样,他无法指示对应应用在后台一直运行或者一直占用系统资源,他只能说明当时他瞬间消耗的电流比较高而已。

如上表示对应的三个进程一直在占用系统资源,持续45小时

值得注意的是,如果状态有所改变,Historian会自动区分颜色

  • JobScheduler

在 Battery Historian 中,"JobScheduler" 是指 Android 系统中的一个调度器,用于在设备空闲时执行后台任务。JobScheduler 允许应用程序安排需要在后台执行的作业或任务,以便在系统资源可用时进行处理,从而提高电量效率和系统性能。

通过使用 JobScheduler,开发人员可以利用系统优化功能,将多个后台任务聚合在一起执行,从而减少设备唤醒次数,节省电量并减少对系统资源的占用。这有助于避免应用程序在不必要的时候频繁唤醒设备,从而提高设备的电池寿命。

PS:即JobSchedule的宗旨就是把一些不是特别紧急的任务放到更合适的时机批量处理。但是感觉他对日常分析好像没有什么太大的作用?

  • Activity Manager Proc

在 Battery Historian 中,"Activity Manager Proc" 是指 Android 系统中的一个关键组件,用于管理应用程序进程和活动。Activity Manager Proc 负责跟踪和管理应用程序的进程生命周期、活动状态以及与系统资源的交互。

通过监视 Activity Manager Proc 数据,可以了解应用程序在设备上的运行情况,包括其进程的创建、销毁、活动状态的变化等。这些信息对于分析应用程序的性能、资源利用情况以及对设备电量消耗的影响非常重要。

如上截图,红色的表示对应进程死亡的瞬间,绿色表示对应进程被启动

同样如果时间轴比较小,他会把这些圆点进行组合

  • AM Low Memory / ANR

"AM Low Memory" 表示 Android 系统的 Activity Manager 在低内存条件下的一种状态。在这种情况下,系统可能会采取一些措施来释放内存,例如终止一些后台进程、清理缓存等,以确保系统的稳定性和性能。

其中"Num Process" 的数值表示在低内存条件下 Activity Manager 监视的当前进程数量。这个指标可以帮助开发人员了解系统在低内存状态下所管理的进程数量,以及系统在释放内存时可能终止的进程数量。

  • Doze

"Doze" 表示设备的省电模式。省电模式是 Android 系统提供的一种功能,旨在延长设备的电池寿命,通过限制应用程序的后台活动来减少电量消耗。以下是 "Doze" 中常见的三种状态及其含义:

  • Doze Off:表示设备的省电模式已关闭,设备未进入任何省电模式。在 Doze Off 状态下,设备不会应用省电模式的限制,应用程序可以自由运行而不受 Doze 模式的影响。
  • Light Doze:表示设备处于轻度睡眠模式。在 Light Doze 状态下,系统会限制某些后台活动以节省电量,但仍允许应用程序在一定程度上保持活动状态。
  • Full Doze:表示设备处于深度睡眠模式。在 Full Doze 状态下,系统会极大限制应用程序的后台活动,包括网络访问和同步操作,以最大程度地减少电量消耗。

通常为了降低功耗,我们希望要求设备在禁止待机状态下更多的处于深度睡眠模式,即PMS原生逻辑在禁止状态没有任何输入和用户锁的情况下,是否能够进入浅度睡眠模式?进入之后又会有一些条件判断是否能够进入深度睡眠模式?进入深度睡眠模式之后后台被限制,后台网络同步操作将在一个固定的周期时间点触发,这样大大节约功耗。如果去掉Full Doze模式,那么后台任务将会频繁被唤起,大大提升功耗,可以参考后面案例。

  • Phone state

‌在Battery Historian中,Phone state表示手机通话状态,包括是否正在通话、接听来电、拨出电话

  • "in":表示设备处于通话状态,即设备正在进行电话通话或有电话呼入的状态。
  • "out":表示设备处于拨打电话状态,即设备正在拨打电话。
  • "off":表示设备处于电话关闭状态,即设备的电话功能处于关闭状态,没有电话呼入或呼出的情况

这些不同的状态可以帮助开发人员更好地了解设备在电话功能方面的运行状态,有助于诊断和解决与通信功能相关的问题。

如上截图可以了解到黑色的in表示当前设备正在通话中,黄色的out表示当前设备正在拨打电话

  • Phone scanning

在 bugreport 中,"Phone scanning" 表示设备正在进行电话扫描的操作。电话扫描是指设备在搜索可用的移动网络信号或其他通信信号的过程。这个信息可以帮助开发人员了解设备在扫描网络信号方面的状态。

  • "off":表示电话扫描功能处于关闭状态,即设备当前未在进行网络信号的扫描。
  • "on":表示电话扫描功能处于开启状态,即设备正在主动进行网络信号的扫描,以便连接到可用的网络信号。

  • Network connectivity

Network connectivity表示网络连接类型,总共如下几种类型,我们接触多的通常WIFI/MOBLE/VPN分别表示当前使用的wifi网络/移动网络/VPN网络

有时候可能同时使用了几种网络,如下图就会换一种颜色来表示,鼠标放到上面有详细的列表显示当前使用的网络类型

  • Mobile signal strength/Wifi signal strength

Mobile signal strength表示移动数据信号是否稳定,白色为none表示没有开启移动网络,黄色为good表示网络比较好,poor就表示网络比较差,这种情况下就越耗电

Wifi signal strength表示wifi信号是否稳定,同上在poor就表示当前wifi信号不稳定,这种情况下会持续耗电

  • Wifi scan/Wifi on/Wifi radio

Wifi ON表示当前时间段wifi功能是否打开,和settings菜单里面的wifi开关一致

Wifi radio表示当前时间段wifi硬件是否处于激活状态,注意和wifi功能进行区分

Wifi scan表示当前时间段wifi模块有没有进行wifi扫描,通常wifi扫描越频繁就越耗电

  • Wifi supplicant

在 Android 系统中,bugreport 是一个用于收集设备信息、日志和其他诊断数据的工具。在 bugreport 报告中,"Wifi supplicant" 是指与 Wi-Fi 连接相关的组件,该组件负责处理设备与 Wi-Fi 网络之间的通信。以下是 "Wifi supplicant" 在 bugreport 中可能出现的一些值以及它们的含义:

  • SCANNING:表示 Wi-Fi supplicant 正在扫描可用的 Wi-Fi 网络。在这种状态下,设备正在搜索可用的 Wi-Fi 热点。
  • ASSOCIATING:表示设备正在尝试与选定的 Wi-Fi 网络建立连接。在这个阶段,设备正在与 Wi-Fi 热点进行握手和认证过程。
  • ASSOCIATED:表示设备已经成功与 Wi-Fi 网络建立连接。设备与 Wi-Fi 网络之间已经建立了通信通道。
  • AUTHENTICATING:表示设备正在进行 Wi-Fi 网络的认证过程。在这个阶段,设备正在验证其身份以获得对 Wi-Fi 网络的访问权限。
  • COMPLETED:表示设备已成功连接到 Wi-Fi 网络并已准备好进行数据传输。
  • DISCONNECTED:表示设备与 Wi-Fi 网络的连接已断开。这可能是由于信号弱、网络故障或用户手动断开连接等原因导致的。

这些状态可能同时存在,但是状态存在改变的时候,颜色肯定会不一样,如下:

  • GPS/Sensor

Sensor和GPS的值都是on和off,on表示该模块处于开启工作状态

  • Coulomb charge/Battery Level/Temperature

Coulomb charge表示设备的电荷状态,描述电池的充电量或放电量;看起来单位是mAh,并随着剩余电量的降低,这个值越小,颜色越淡,它和Battery Level成正比

Battery Level表示当前剩余电量的百分比,从密集程度可以了解到好点是否均匀,它和电池曲线存在一些关联

Temperature表示设备当前温度,颜色越深说明温度越高

2、App Selection应用排行榜

除了上面介绍的一些图形化能够清晰的让我们了解到设备的一些列相关参数的情况之外,还可以通过中间部分的App Selection来对应用进行各种相关参数的排行榜:

Device estimated power use

Device estimated power use描述的是各个应用进程的使用的电量,并从高到低给他们进行排序,其数据来源于bugreport里面的Estimated power use字段。

如下案例,bugreport和排行榜显示第一个应用耗电占比15%。

Estimated power use (mAh):
    Capacity: 8000, Computed drain: 2960, actual drain: 2800-2960
    Global
      screen: 60.5 apps: 60.5 duration: 29m 10s 609ms 
      cpu: 130 apps: 130
      system_services: 40.0 apps: 40.0
      mobile_radio: 1469 apps: 1327 duration: 19h 39m 8s 307ms 
      sensors: 2.35 apps: 2.35
      wifi: 84.6 apps: 10.8 duration: 2d 11h 19m 29s 219ms 
      wakelock: 183 apps: 2.51 duration: 2d 15h 11m 27s 57ms 
      phone: 0.830 apps: 0 duration: 17s 277ms 
      idle: 185 apps: 0 duration: 2d 15h 40m 37s 666ms 
    UID u0a99: 1224 fg: 1223 ( cpu=1.94 (10m 1s 526ms) cpu:fg=1.94 (6m 22s 561ms) system_services=0.896 mobile_radio=1220 (16h 25m 0s 942ms) mobile_radio:fg=1220 wifi=0.577 (16s 580ms) wifi:fg=0.577 wakelock=0.00613 (7s 614ms) ) 
    UID 0: 279 fg: 0.0189 ( cpu=51.2 (4h 51m 45s 774ms) mobile_radio=46.7 (37m 41s 370ms) wifi=0.0189 (437ms) wifi:fg=0.0189 wakelock=181 (2d 14h 19m 33s 15ms) ) 
    UID u0a105: 44.5 fg: 0.114 fgs: 0.0278 ( screen=44.2 (20m 13s 426ms) cpu=0.142 (1m 11s 129ms) cpu:fg=0.114 (22s 367ms) cpu:fgs=0.0278 (5s 478ms) system_services=0.0998 ) 
    UID u0a133: 30.4 fg: 0.144 fgs: 4.79 ( cpu=4.94 (41m 27s 118ms) cpu:fg=0.144 (28s 350ms) cpu:fgs=4.79 (15m 43s 192ms) audio=0 (8s 319ms) system_services=25.4 wakelock=0.0215 (26s 628ms) ) 
    UID u0a107: 21.6 fgs: 21.6 ( cpu=21.6 (1h 35m 46s 515ms) cpu:fgs=21.6 (1h 10m 42s 546ms) system_services=0.0131 ) 
    UID 1073: 15.7 fg: 15.5 ( cpu=0.156 (1m 5s 581ms) cpu:fg=0.156 (30s 654ms) mobile_radio=15.0 (12m 7s 167ms) mobile_radio:fg=15.0 wifi=0.284 (8s 277ms) wifi:fg=0.284 wakelock=0.294 (6m 5s 406ms) ) 
    UID u0a176: 15.7 fg: 0.0184 bg: 0.0323 cached: 0.535 ( screen=15.0 (6m 52s 226ms) cpu=0.00567 (25s 369ms) cpu:fg=0.00254 (500ms) cpu:bg=0.000422 (83ms) cpu:cached=0.00271 (533ms) system_services=0.00602 mobile_radio=0.580 (28s 89ms) mobile_radio:fg=0.0159 mobile_radio:bg=0.0319 mobile_radio:cached=0.532 wakelock=0.129 (2m 40s 396ms) ) 
    UID u0a184: 12.9 bg: 2.63 cached: 9.86 ( cpu=0.284 (2m 35s 617ms) cpu:bg=0.0912 (17s 938ms) cpu:cached=0.177 (34s 862ms) system_services=0.0984 mobile_radio=11.9 (9m 36s 360ms) mobile_radio:bg=2.52 mobile_radio:cached=9.38 wifi=0.321 (9s 430ms) wifi:bg=0.0177 wifi:cached=0.300 wakelock=0.296 (6m 7s 58ms) ) 
    UID u0a185: 12.4 bg: 0.986 cached: 11.0 ( cpu=0.197 (2m 4s 980ms) cpu:bg=0.0888 (17s 471ms) cpu:cached=0.108 (21s 323ms) system_services=0.0853 mobile_radio=11.6 (9m 19s 365ms) mobile_radio:bg=0.857 mobile_radio:cached=10.7 wifi=0.276 (8s 123ms) wifi:bg=0.0401 wifi:cached=0.236 wakelock=0.288 (5m 57s 847ms) ) 
    UID u0a80: 9.54 fg: 0.567 ( cpu=0.567 (6m 46s 478ms) cpu:fg=0.567 (1m 51s 598ms) system_services=8.97 ) 
    UID u0a174: 6.97 bg: 1.35 cached: 5.00 ( cpu=0.0809 (1m 17s 215ms) cpu:bg=0.0417 (8s 206ms) cpu:cached=0.0391 (7s 700ms) system_services=0.0189 mobile_radio=5.70 (4m 35s 944ms) mobile_radio:bg=1.30 mobile_radio:cached=4.40 wifi=0.564 (16s 754ms) wifi:bg=0.00648 wifi:cached=0.557 wakelock=0.605 (12m 31s 372ms) ) 
    UID u0a194: 5.84 fg: 0.00676 bg: 1.13 cached: 4.22 ( cpu=0.0820 (54s 773ms) cpu:bg=0.0257 (5s 62ms) cpu:cached=0.0563 (11s 77ms) system_services=0.236 mobile_radio=4.27 (3m 26s 746ms) mobile_radio:bg=1.08 mobile_radio:cached=3.19 wifi=1.00 (29s 329ms) wifi:fg=0.00676 wifi:bg=0.0224 wifi:cached=0.973 wakelock=0.250 (5m 10s 307ms) ) 
    UID 1020: 5.81 fg: 5.78 ( cpu=0.0353 wifi=5.78 (2m 51s 496ms) wifi:fg=5.78 ) 
    UID u0a183: 5.42 bg: 0.0102 cached: 5.38 ( cpu=0.0558 (42s 774ms) cpu:bg=0.00111 (219ms) cpu:cached=0.0547 (10s 757ms) system_services=0.0290 mobile_radio=5.29 (4m 16s 420ms) mobile_radio:bg=0.00913 mobile_radio:cached=5.29 wifi=0.0364 (1s 70ms) wifi:cached=0.0364 wakelock=0.00722 (8s 961ms) ) 
    UID u0a132: 4.15 bg: 3.29 ( cpu=1.90 (9m 14s 312ms) cpu:bg=1.90 (6m 13s 1ms) system_services=0.853 mobile_radio=1.39 (1m 7s 288ms) mobile_radio:bg=1.39 wakelock=0.0161 (19s 938ms) ) 
    UID u0a110: 3.24 fg: 0.975 ( cpu=0.975 (9m 23s 216ms) cpu:fg=0.975 (3m 11s 829ms) system_services=2.26 ) 
    UID 1066: 2.27 ( cpu=2.27 (27m 51s 351ms) ) 
    UID 1010: 1.93 fg: 1.09 ( cpu=0.835 wifi=1.09 (31s 859ms) wifi:fg=1.09 ) 
    UID 1036: 1.80 ( cpu=1.80 (22m 56s 256ms) ) 
    UID 2000: 1.47 cached: 0.189 ( cpu=1.47 (17m 21s 428ms) cpu:cached=0.189 (37s 170ms) ) 
    UID u0a187: 1.40 bg: 0.00865 cached: 1.34 ( cpu=0.0624 (29s 722ms) cpu:bg=0.00805 (1s 584ms) cpu:cached=0.0544 (10s 701ms) system_services=0.0344 mobile_radio=1.23 (59s 380ms) mobile_radio:bg=0.000599 mobile_radio:cached=1.23 wifi=0.0644 (1s 895ms) wifi:cached=0.0644 wakelock=0.0143 (17s 795ms) ) 
    UID u0a109: 1.21 fg: 0.00152 cached: 0.00629 ( screen=1.18 (32s 368ms) cpu=0.00860 (6s 166ms) cpu:fg=0.00152 (299ms) cpu:cached=0.00629 (1s 238ms) audio=0 (2s 574ms) system_services=0.0201 sensors=0.0000133 (4s 356ms) ) 
    UID u0a96: 0.949 bg: 0.947 ( cpu=0.313 (3m 4s 662ms) cpu:bg=0.313 (1m 1s 490ms) system_services=0.00258 mobile_radio=0.634 (30s 711ms) mobile_radio:bg=0.634 ) 
    UID u0a197: 0.863 bg: 0.119 cached: 0.670 ( cpu=0.00815 (13s 370ms) cpu:bg=0.00214 (421ms) cpu:cached=0.00601 (1s 182ms) system_services=0.0111 mobile_radio=0.781 (37s 814ms) mobile_radio:bg=0.116 mobile_radio:cached=0.664 wakelock=0.0633 (1m 18s 534ms) ) 
    UID u0a170: 0.646 bg: 0.0849 cached: 0.493 ( cpu=0.0122 (18s 693ms) cpu:bg=0.00315 (620ms) cpu:cached=0.00898 (1s 767ms) system_services=0.00484 mobile_radio=0.556 (26s 944ms) mobile_radio:bg=0.0818 mobile_radio:cached=0.475 wifi=0.00988 (291ms) wifi:cached=0.00988 wakelock=0.0629 (1m 18s 125ms) ) 
    UID u0a126: 0.620 fg: 0.424 ( cpu=0.424 (1m 22s 226ms) cpu:fg=0.424 (1m 23s 397ms) system_services=0.196 ) 
    UID 1051: 0.608 fg: 0.608 ( wifi=0.608 (17s 304ms) wifi:fg=0.608 ) 
    UID u0a121: 0.393 fg: 0.390 ( cpu=0.390 (4m 41s 881ms) cpu:fg=0.390 (1m 16s 808ms) video=0 (4s 373ms) system_services=0.00286 ) 
    UID u0a193: 0.390 fg: 0.0000433 bg: 0.198 cached: 0.102 ( cpu=0.0243 (24s 575ms) cpu:bg=0.0122 (2s 407ms) cpu:cached=0.0120 (2s 363ms) system_services=0.00462 mobile_radio=0.276 (13s 360ms) mobile_radio:bg=0.186 mobile_radio:cached=0.0901 wifi=0.0000433 (1ms) wifi:fg=0.0000433 wakelock=0.0850 (1m 45s 556ms) ) 
    UID u0a178: 0.385 fg: 0.00155 bg: 0.0000511 cached: 0.366 ( cpu=0.0122 (9s 651ms) cpu:bg=0.0000305 (6ms) cpu:cached=0.0122 (2s 402ms) system_services=0.0169 mobile_radio=0.341 (16s 537ms) mobile_radio:bg=0.0000206 mobile_radio:cached=0.341 wifi=0.0144 (427ms) wifi:fg=0.00155 wifi:cached=0.0128 wakelock=0.000326 (405ms) ) 
    UID u0a181: 0.336 bg: 0.175 cached: 0.101 ( cpu=0.00185 (12s 927ms) cpu:bg=0.00131 (258ms) cpu:cached=0.000534 (105ms) system_services=0.000158 mobile_radio=0.274 (13s 288ms) mobile_radio:bg=0.174 mobile_radio:cached=0.100 wakelock=0.0599 (1m 14s 343ms) ) 
    UID u0a148: 0.331 fg: 0.00207 bg: 0.0178 cached: 0.164 ( cpu=0.00167 (16s 948ms) cpu:bg=0.000600 (118ms) cpu:cached=0.000778 (153ms) system_services=0.00201 mobile_radio=0.180 (8s 713ms) mobile_radio:bg=0.0172 mobile_radio:cached=0.163 wifi=0.00274 (81ms) wifi:fg=0.00207 wifi:cached=0.000672 wakelock=0.145 (2m 59s 745ms) ) 
    UID u0a169: 0.293 bg: 0.00236 fgs: 0.0202 cached: 0.186 ( cpu=0.0447 (28s 757ms) cpu:bg=0.00236 (465ms) cpu:fgs=0.0141 (2s 766ms) cpu:cached=0.0283 (5s 567ms) system_services=0.0841 mobile_radio=0.156 (7s 556ms) mobile_radio:fgs=0.000826 mobile_radio:cached=0.155 wifi=0.00773 (215ms) wifi:fgs=0.00535 wifi:cached=0.00238 wakelock=0.000169 (210ms) ) 
    UID u0a189: 0.282 bg: 0.0405 cached: 0.00661 ( cpu=0.0223 (14s 127ms) cpu:bg=0.0123 (2s 412ms) cpu:cached=0.00661 (1s 300ms) system_services=0.000474 mobile_radio=0.0283 (1s 370ms) mobile_radio:bg=0.0283 sensors=0.174 (15h 47m 17s 887ms) wakelock=0.0572 (1m 10s 988ms) ) 
    UID 1001: 0.224 fg: 0.217 ( cpu=0.217 (1m 49s 457ms) cpu:fg=0.217 (42s 785ms) wakelock=0.00646 (8s 21ms) ) 
    UID u0a191: 0.191 cached: 0.0149 ( cpu=0.0000559 cpu:cached=0.0000559 (11ms) mobile_radio=0.0148 (718ms) mobile_radio:cached=0.0148 sensors=0.176 (15h 58m 57s 254ms) ) 
    UID u0a179: 0.176 cached: 0.0000661 ( cpu=0.0000661 (23ms) cpu:cached=0.0000661 (13ms) sensors=0.176 (15h 58m 57s 254ms) ) 
    UID u0a177: 0.174 ( cpu=0.0000763 sensors=0.174 (15h 47m 14s 707ms) ) 
    UID u0a125: 0.167 fg: 0.00918 ( cpu=0.00918 (6s 186ms) cpu:fg=0.00918 (1s 806ms) system_services=0.158 ) 
    UID u0a122: 0.147 fgs: 0.0282 ( cpu=0.0282 (10s 762ms) cpu:fgs=0.0282 (5s 542ms) system_services=0.119 ) 
    UID u0a106: 0.140 fg: 0.0454 ( cpu=0.0454 (14s 60ms) cpu:fg=0.0454 (8s 922ms) system_services=0.0950 ) 
    UID 1041: 0.115 ( cpu=0.115 (1m 26s 422ms) wakelock=0.000283 (351ms) ) 
    UID u0a171: 0.105 cached: 0.0901 ( cpu=0.0166 (8s 470ms) cpu:cached=0.0166 (3s 273ms) system_services=0.0151 mobile_radio=0.0735 (3s 559ms) mobile_radio:cached=0.0735 ) 
    UID 1021: 0.0926 ( cpu=0.0926 (1m 11s 21ms) ) 
    UID u0a108: 0.0738 bg: 0.0120 ( cpu=0.0120 (5s 592ms) cpu:bg=0.0120 (2s 360ms) system_services=0.0617 wakelock=0.0000733 (91ms) ) 
    UID u0a155: 0.0738 fg: 0.000178 bg: 0.000122 cached: 0.00176 ( cpu=0.00229 (2s 172ms) cpu:fg=0.000178 (35ms) cpu:bg=0.000122 (24ms) cpu:cached=0.00176 (347ms) system_services=0.0713 wakelock=0.000208 (258ms) ) 
    UID u0a88: 0.0442 cached: 0.000366 ( screen=0.0419 (1s 149ms) cpu=0.000366 (352ms) cpu:cached=0.000366 (72ms) system_services=0.00201 sensors=0.00000082 (269ms) ) 
    UID 9999: 0.0339 ( cpu=0.0339 (9s 211ms) ) 
    UID u0a173: 0.0265 bg: 0.0000153 cached: 0.0115 ( cpu=0.0115 (3s 744ms) cpu:bg=0.0000153 (3ms) cpu:cached=0.0115 (2s 255ms) system_services=0.0149 wakelock=0.0000773 (96ms) ) 
    UID u0a62: 0.0229 fg: 0.00180 ( cpu=0.00180 (1s 710ms) cpu:fg=0.00180 (354ms) system_services=0.0211 ) 
    UID u0a172: 0.0181 bg: 0.0000763 cached: 0.00365 ( cpu=0.0155 (7s 777ms) cpu:bg=0.0000763 (15ms) cpu:cached=0.00365 (718ms) system_services=0.00218 wakelock=0.000503 (625ms) ) 
    UID u0a120: 0.0170 fg: 0.00102 ( cpu=0.00102 (889ms) cpu:fg=0.00102 (200ms) system_services=0.0160 ) 
    UID u0a192: 0.0128 bg: 0.0000153 cached: 0.00694 ( cpu=0.00695 (5s 459ms) cpu:bg=0.0000153 (3ms) cpu:cached=0.00694 (1s 365ms) system_services=0.00569 wakelock=0.000138 (171ms) ) 
    UID u0a31: 0.0127 bg: 0.000127 fgs: 0.0000763 cached: 0.00131 ( cpu=0.00211 (1s 447ms) cpu:bg=0.000127 (25ms) cpu:fgs=0.0000763 (15ms) cpu:cached=0.00131 (257ms) system_services=0.0106 ) 
    UID u0a138: 0.00621 fg: 0.00446 ( cpu=0.00382 (1s 349ms) cpu:fg=0.00382 (751ms) system_services=0.00176 wifi=0.000639 (19ms) wifi:fg=0.000639 ) 
    UID u0a162: 0.00572 fg: 0.00287 ( cpu=0.00287 (1s 262ms) cpu:fg=0.00287 (564ms) system_services=0.00286 ) 
    UID 1047: 0.00560 ( cpu=0.00560 (1s 278ms) ) 
    UID u0a119: 0.00548 cached: 0.000173 ( cpu=0.000173 (589ms) cpu:cached=0.000173 (34ms) system_services=0.00530 ) 
    UID u0a180: 0.00547 bg: 0.0000102 ( cpu=0.00150 (1s 811ms) cpu:bg=0.0000102 (2ms) system_services=0.00397 ) 
    UID u0a158: 0.00499 cached: 0.000946 ( cpu=0.000946 (739ms) cpu:cached=0.000946 (186ms) system_services=0.00392 wakelock=0.000123 (153ms) ) 
    UID u0a156: 0.00439 fgs: 0.000849 ( cpu=0.000849 (595ms) cpu:fgs=0.000849 (167ms) system_services=0.00354 ) 
    UID u0a35: 0.00380 cached: 0.000244 ( cpu=0.000244 (258ms) cpu:cached=0.000244 (48ms) system_services=0.00337 wakelock=0.000184 (229ms) ) 
    UID 1013: 0.00373 ( cpu=0.00373 (2s 922ms) ) 
    UID 1069: 0.00280 ( cpu=0.00280 ) 
    UID 1046: 0.00250 ( cpu=0.00250 (1s 586ms) ) 
    UID u0a81: 0.00249 bg: 0.000193 ( cpu=0.000193 (192ms) cpu:bg=0.000193 (38ms) system_services=0.00230 ) 
    UID u0a168: 0.00220 cached: 0.000173 ( cpu=0.000300 (380ms) cpu:cached=0.000173 (34ms) system_services=0.00190 ) 
    UID u0a101: 0.00187 cached: 0.000391 ( cpu=0.000391 (144ms) cpu:cached=0.000391 (77ms) system_services=0.00148 ) 
    UID u0a92: 0.00181 fgs: 0.000468 ( cpu=0.000468 (415ms) cpu:fgs=0.000468 (92ms) system_services=0.00134 ) 
    UID u0a196: 0.00171 cached: 0.000549 ( cpu=0.000549 (337ms) cpu:cached=0.000549 (108ms) system_services=0.00116 ) 
    UID u0a186: 0.00106 cached: 0.000468 ( cpu=0.000468 (363ms) cpu:cached=0.000468 (92ms) system_services=0.000592 ) 
    UID u0a59: 0.000917 cached: 0.0000712 ( cpu=0.000147 (186ms) cpu:cached=0.0000712 (14ms) system_services=0.000770 ) 
    UID 1067: 0.000829 ( cpu=0.000829 ) 
    UID 1040: 0.000763 ( cpu=0.000763 ) 
    UID u0a71: 0.000685 cached: 0.0000559 ( cpu=0.000132 (144ms) cpu:cached=0.0000559 (11ms) system_services=0.000553 ) 
    UID u0a131: 0.000645 cached: 0.0000305 ( cpu=0.000132 (97ms) cpu:cached=0.0000305 (6ms) system_services=0.000513 ) 
    UID u0a123: 0.000475 fg: 0.0000407 ( cpu=0.0000407 (42ms) cpu:fg=0.0000407 (8ms) system_services=0.000434 ) 
    UID u0a64: 0.000470 fg: 0.0000356 ( cpu=0.0000356 (37ms) cpu:fg=0.0000356 (7ms) system_services=0.000434 ) 
    UID 1092: 0.000381 ( cpu=0.000381 (212ms) ) 
    UID u0a98: 0.000372 fg: 0.0000559 ( cpu=0.0000559 (48ms) cpu:fg=0.0000559 (11ms) system_services=0.000316 ) 
    UID u0a135: 0.000356 fg: 0.0000407 ( cpu=0.0000407 (29ms) cpu:fg=0.0000407 (8ms) system_services=0.000316 ) 
    UID u0a141: 0.000351 fg: 0.0000356 ( cpu=0.0000356 (37ms) cpu:fg=0.0000356 (7ms) system_services=0.000316 ) 
    UID u0a112: 0.000346 fg: 0.0000305 ( cpu=0.0000305 (29ms) cpu:fg=0.0000305 (6ms) system_services=0.000316 ) 
    UID u0i26: 0.000316 ( system_services=0.000316 ) 
    UID u0a182: 0.000280 cached: 0.000280 ( cpu=0.000280 cpu:cached=0.000280 (55ms) ) 
    UID u0i25: 0.000276 ( system_services=0.000276 ) 
    UID 1082: 0.000193 ( cpu=0.000193 ) 
    UID u0a25: 0.000158 cached: 0.0000203 ( cpu=0.0000203 (15ms) cpu:cached=0.0000203 (4ms) system_services=0.000138 ) 
    UID 1017: 0.000107 ( cpu=0.000107 (69ms) ) 
    UID 1027: 0.0000966 fg: 0.0000966 ( cpu=0.0000966 (106ms) cpu:fg=0.0000966 (19ms) ) 
    UID u0a175: 0.0000813 cached: 0.0000813 ( cpu=0.0000813 (12ms) cpu:cached=0.0000813 (16ms) ) 
    UID 1019: 0.0000763 ( cpu=0.0000763 (15ms) ) 
    UID 1072: 0.0000559 ( cpu=0.0000559 (9ms) ) 
    UID u0a54: 0.0000508 cached: 0.0000356 ( cpu=0.0000508 cpu:cached=0.0000356 (7ms) ) 
    UID 1053: 0.0000407 ( cpu=0.0000407 (20ms) ) 
    UID u0a73: 0.0000305 ( cpu=0.0000305 ) 
    UID u0a79: 0.0000305 cached: 0.0000305 ( cpu=0.0000305 cpu:cached=0.0000305 (6ms) ) 
    UID 1068: 0.0000254 fg: 0.0000254 ( cpu=0.0000254 (34ms) cpu:fg=0.0000254 (5ms) ) 
    UID 2903: 0.0000254 ( cpu=0.0000254 (25ms) ) 
    UID u0a195: 0.0000254 cached: 0.0000254 ( cpu=0.0000254 cpu:cached=0.0000254 (5ms) ) 
    UID u0a163: 0.0000203 cached: 0.00000508 ( cpu=0.0000203 cpu:cached=0.00000508 (1ms) ) 
    UID u0i17: 0.0000197 ( system_services=0.0000197 ) 
    UID u0i23: 0.0000197 ( system_services=0.0000197 ) 
    UID u0a58: 0.0000153 cached: 0.0000153 ( cpu=0.0000153 cpu:cached=0.0000153 (3ms) ) 
    UID u0a124: 0.0000153 ( cpu=0.0000153 ) 
    UID u0a36: 0.0000102 ( cpu=0.0000102 ) 
    UID u0a27: 0.00000508 cached: 0.00000508 ( cpu=0.00000508 cpu:cached=0.00000508 (1ms) ) 
    UID u0a70: 0.00000508 ( cpu=0.00000508 ) 

3、案例分析

3.1 应用持锁导致无法息屏

如上截图前面5个小时屏幕一直常亮,无法息屏

Userspace wakelock和Foreground process可以看出DECT应用持锁持续五个小时,导致无法正常息屏

3.2 应用任务导致耗电模块持续运行

如上截图可以看出45小时一直在通话过程中,后续GPS频繁启动和扫描,让设备退出深度睡眠模式

后确定和这两个应用有关系。

3.3 WIFI信号不好导致功耗高

如上截图wifi信号poor,表示信号相当不好,会增加wifi模块的耗电量

3.4 无法深度睡眠导致功耗高

如上截图Doze一直为黄色,即浅度休眠,导致后台应用频繁被唤起,后了解到此项目关闭了深度睡眠。

3.5 三方应用导致一夜待机耗电量增高

正常机器

异常机器差异点为cpu running持续运行,原因是radio持续活跃

最后通过Estimated power use来看客户应用异常活跃导致

3.6 底电流持续高达40ma

底电流可通过第二章进行测试,开启飞行模式即可测试底电流,底电流通常反馈系统运行最低电流,即器件功耗,因此通常有经验认为底电流异常通常为器件导致,当然这个结论其实根本不严谨。

如上底电流测试的时候发现cpu/kernel频繁被激活,CPU根本没有进入低功耗模式,最后和BSP同事沟通,拔出LCD器件,恢复正常,后跟踪日志断定器件BSP代码异常导致

二、电流测试

电流测试通常分为底电流测试和待机电流测试以及其他各种场景的电流。

  • 底电流:表示了当前系统的最低电流,开机飞行模式静止十分钟,让其进入深度睡眠之后的电流。
  • 待机电流:通常为息屏待机,但是可能插入SIM卡,可能有其他后台进程。
  • 各种场景:根据测试的定义,例如持续放视频的电流、wifi电流等

这里介绍几个仪器来进行电流相关的测试。这些仪器需要代替电源,因此需要把手机/设备的电池替换成一个假电池,如果这个假电池有电,会影响测试的准确性。

1. Agilent程控电源

步骤一:加载bin文件

步骤二:圈选当前电流图

当前电流图表示测试时长5分钟,平均电流为11.717mA,在结合具体场景对应为XXX电流。

Agilent的一大缺点就是无法去精确的计算某一时间段的平均电流。

2. Power monitor

步骤一:连接假电池到 Powermonitor,假电池尽量不要使用大电容【注:假电池需要带 NTC 电阻,否则可能不能正常开机】

步骤二:打开Powermonitor软件,设置电源恒定电压(即对手机的供电电压),一般调节范围为3.8V~4.2V,点击Set Vout弹出调节对话框,可手动设置输出电压:手机一般设置3.8V 、4.0V测试

步骤三:调整参数之后可以对手机通电开始数据采集。当手机开机后,点击PowerTool界面右下方的RUN按钮,就已经开始对手机的耗电数据进行记录和曲线图显示

步骤四:查看电流图,Power monitor方便的就是可以任意圈中时间段,自动计算平均电流

### Battery Historian 工具概述 Battery Historian 是一种强大的分析工具,专门设计用于帮助开发者了解 Android 应用程序如何影响设备的电池消耗。通过可视化的方式展示电池使用情况的数据,该工具能够提供详细的洞察力来优化应用性能并延长设备续航时间。 #### 安装与配置 尽管最新版 Battery Historian 增加了一些复杂性,但它带来了显著的功能提升[^3]。例如,在 Google I/O 2015 上发布的 Battery Historian 2.0 提供了更清晰的报告、针对每个应用程序的摘要以及更快的操作速度。然而需要注意的是,官方文档脚本主要面向 Linux Mac OS 用户;如果是在 Windows 平台上部署,则可能需要额外调整设置过程。 #### 数据获取方法 为了收集必要的数据以便于后续分析,可以利用 `adb` 命令行工具提取电池统计信息。比如要打印自上次充电以来所有应用程序的电量使用统计数据(CSV 格式),可运行如下命令: ```bash $ adb shell dumpsys batterystats --charged --checkin ``` 此操作会生成详尽的日志文件作为输入源供给 Battery Historian 进一步解析处理[^2]。 另外还可以查看特定时间段内的进程内存占用状况,这对于全面评估资源利用率很有价值。假如想获得过去三小时的应用程序内存用量详情,只需执行下面这条指令即可: ```bash $ adb shell dumpsys procstats --hours 3 ``` 上述结果将以易于理解的形式呈现出来[^4]。 #### 使用场景说明 当致力于改善Android app 的耗电表现时,Battery Historian 成为不可或缺的好帮手之一。它不仅揭示哪些组件最耗费能量,还指导我们采取相应措施减少不必要的开销从而达到最佳效果[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诸神黄昏EX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值