应用耗电排行——AccuBattery 和 Android 系统为什么数字不一样
先看一个现象
打开 Android 系统的「电池用量」面板和 AccuBattery 的「应用耗电排行」,你可能会发现:两个 App 的耗电百分比排序对不上。谁对谁错?
答案是——都不完全精确,但 AccuBattery 的方法更诚实。
Android 系统的做法
Android 系统的电池用量面板采用 profile 估算:
- 系统能精确测量的只有整机的电池消耗
- 但它无法精确知道每个 App 各用了多少电
- 所以它为每个 App 分配一个能耗 profile——比如「CPU 活动 1 分钟 = 用 X mAh,屏幕亮 1 分钟 = 用 Y mAh」
- 然后根据每个 App 的前台/后台运行时长,套公式算出来
问题是:这些 profile 是预设值,不是你的手机在你的使用场景下真实测出来的。同一款 App 在不同手机上、不同亮度下、不同网络条件下,真实耗电可能差 2-3 倍。
AccuBattery 的做法
AccuBattery 采用前台计量法:
- 当某个 App 在前台时,持续测量整机的实时电流消耗
- 把这段时间的全部整机电流消耗算到这个前台 App 头上
- 多个 App 分时前台 → 各算各的时间段 → 累加出各 App 的前台耗电
AccuBattery 帮助中心里明确解释了这个设计的原因:
"AccuBattery 放弃了 profile 估算,因为它永远不准。团队宁可粗一点但诚实——当 App A 在前台时,整台手机用了多少电就是它用了多少电。"
这种方法的好处
- 真实测量,不依赖预设 profile
- 能抓到某些 Android 系统漏掉的后台服务——比如某些 App 在前台时悄悄运行的后台线程,Android 系统不分配给前台 App,但 AccuBattery 会算进去
- 非常适合对比——在同一个条件下(比如都亮屏、都中等亮度),两次前台会话的耗电可以直接比
这种方法的局限
AccuBattery 团队也不回避这个问题:
"当 App A 在前台时,App B 的后台唤醒消耗也会被算到 App A 头上。比如你开着时钟 App 但后台有 App 在同步数据,那同步的耗电也被算到时钟头上。"
但他们认为这是合理的折中:
- 大部分耗电来自屏幕和前台 App 的 CPU 活动
- 后台 App 独立运行时(屏幕关闭、没有前台 App),这些后台进程的消耗不会被加到任何前台 App 头上(因为屏幕关闭时没有前台 App 概念)
- 误差在可接受范围内
亮屏 vs 灭屏的处理
- 亮屏时有前台 App:整机耗电算给这个前台 App
- 灭屏时:没有前台 App 概念,耗电归入「系统 / 待机」,不分配给任何 App
怎么用它
- 测试新 App 的真实耗电:打开 App 用 10 分钟(标准使用场景),看 AccuBattery 显示的这 10 分钟前台耗电。和其他 App 同条件对比
- 测试省电模式是否真的省电:开 vs 关省电模式,在同一 App 前台使用下,看耗电数字差多少
- 游戏耗电排行:AccuBattery 的结果比 Android 系统的 profile 估算更可信
下一篇:前台计量法原理详解