Android 待机耗电篇 ( Nowakelock & DeepSleep & BetterBatteryStats)

  • DeepSleep & BetterBatteryStats & Nowakelock 使用指南

  • 资料来源:

    https://www.linangran.com/?p=611
    https://forum.xda-developers.com/t/app-2-2-05-oct-v2-4-betterbatterystats.1179809/
    https://www.oneplusbbs.com/forum.php?mod=viewthread&tid=366390&version=5

  • 更新

    1
    2022.06.19 初始

导语

deepsleep 目前进度接近稳定版,也是时候扩充一下文档说明了,这一篇应该会尽量写全所有问题,尽量没有玄学词语(还是有一些)的解答以下问题:

  • Android 待机耗电元凶有那些
  • BetterBatteryStats 如何正常安装
  • Nowakelock/DeepSleep 如何配合 BBS 使用

如果你有知道其他的信息,欢迎评论区 or 邮件补充.

Android 待机耗电来源

早晨拿起手机发现一晚上掉电掉了一半,这是早年 android 的常事.

通俗的说关掉屏幕后,经过一段时间,手机会进入低功耗待机模式,此时待机一晚上耗电很少多在 5% 以内.

假如手机一直不能正常进入低功耗待机模式,此时手机的耗电基本与 (开屏屏幕耗电 - 屏幕功耗) 差不太多,电量就这样快速跑没了. 严重一点有时关屏放裤兜,手机莫名烫的不行,开屏发现掉电巨多.

因此要找到手机不能进入低功耗待机的原因,归结

  • 硬件原因 or 环境原因: 这些在看系统耗电时候有体现
    • 信号不好时,手机定时与基站通信,需要加大功率.此时就体现在 系统耗电->移动网络待机 这一项居高.
    • 硬件 bug,刚买的手机啥都没安装,开 wifi 待机掉电掉一半,不开 wifi 没事,这样一般是去售后.
  • Android 系统 : 著名的 MIUI 13…
    • 典型表现是更新了那个版本的系统,突然耗电量剧增. 表现在 系统耗电 -> Android 系统 or Android 操作系统 耗电远远超过其他.
  • 乱来的应用: 腾讯系/阿里系/头条系
    • 典型表现: 没安装这个应用之前啥事没有,安装一些应用后待机巨差.有的会表现在 系统耗电 -> 单个应用耗电很多,诡异一点的也会是应用没问题,但 Android 系统 耗电巨高.

以上也只是说到了一些常见情况,还有 N 多千奇百怪的状况出现,没有标准答案.

说完了可能的原因,接下来该说说怎么排查问题了 -> BetterBatteryStats

BetterBatteryStats

以下简称 bbs.

bbs 是历史相当悠久的查看唤醒的软件了

  • xda 原帖
  • BetterBatteryStats-Knowledge-Base

安装

bbs 目前有两个版本

  • xda or f-droid
  • play 商店

两者包名上差个 _xdaedition 其他相同,下面都是 xda 版本为例,所以包名是 com.asksven.betterbatterystats_xdaedition

bbs 支持 adb(no-root) or root 模式.

下载后正常安装,打开正常授予 电话权限, root (如果设备已 root) 权限

但因为 android 系统权限变化,还需 adb 执行一些命令.

连接手机 adb 执行

1
2
3
adb -d shell pm grant com.asksven.betterbatterystats_xdaedition android.permission.BATTERY_STATS  
adb -d shell pm grant com.asksven.betterbatterystats_xdaedition android.permission.DUMP
adb -d shell pm grant com.asksven.betterbatterystats_xdaedition android.permission.PACKAGE_USAGE_STATS

如果你的手机有 root 到这一步就可以了,如果不行再执行下面命令

Andorid 9 及以上限制了非 sdk api 的访问,而这是 bbs 依赖的.因此继续执行

1
2
3
4
5
6
SDK28 (Android 9)  
adb -d shell settings put global hidden_api_policy_pre_p_apps 1
adb -d shell settings put global hidden_api_policy_p_apps 1

SDK29 (Android 10 及以上)
adb -d shell settings put global hidden_api_policy 1

最终是保证 bbs 权限检查界面没有红的.(设置 -> 高级 -> App Perssions)

wakelock(唤醒锁) alarm(定时器/闹钟) 是什么?

Android 开发者网站 -> 管理设备唤醒状态 详细说明了如何在关屏状态下如何让设备 cpu 正常运转,保持唤醒状态.

说人话:

  • wakelock(唤醒锁): 就像是一个真的锁,cpu 想睡觉,应用不给开门,cpu 就只能继续干活到应用满意给解锁开门为止.
  • alarm(定时器/闹钟): 应用说 cpu 你先睡吧,cpu睡了.但应用反手在床边放了个闹钟,到点 cpu 被吵醒,应用说你还得继续干活. 闹钟可以是一次性,可以是周期的..

未汉化部分说明

3 个菜单,分别说明

bbs 整体逻辑是比较好懂的

  • 1 菜单代表下面显示的是那些数据
  • 2 菜单代表数据统计开始时间点, 3 菜单代表数据统计结束时间点.
  • 2-3 菜单的项目都是在说时间点

2-3 ->

  • Unplugged: 上次拔掉电源时间点
  • Screen Off: 上次关屏时间点
  • Screen On: 上次屏幕打开时间
  • Custom: 用户自定义时间点 (右上角 -> 设置自定义区间)
  • Current: 当前时间点

1 菜单说明

Summary 总览,各种状态的占比

  • DeepSleep 低功耗待机状态
  • Awake(Screen Off) 关屏后后台唤醒时间,图上是关屏期间唤醒 30%.
  • Screen On 开屏时间
  • Wifi On 打开 wifi 的时间
  • Doze 的两种状态
  • 其他不用看了

上文提到的 wakelock 的来源可以是 android 系统也可以是应用,在 bbs 里是分开展示的.即 Kernerl Wakelock 和 Partial Wakelocks

Kernerl Wakelock 内核唤醒锁/核心唤醒锁 代表的是由 Android 系统产生的唤醒锁

  • PowerManger** 代表的是 Partial Wakelocks 部分唤醒锁 在系统的表现.
  • 如果你想了解更多 -> Kernel Wakelocks and You xda 关于 Kernerl Wakelock 的一个帖子,很老了.

Partial Wakelocks 部分唤醒锁,这个是应用(包括系统应用)产生的 wakelock,重点关注

  • 这里能看到 wakelock 名称,来源,次数,时间等等
  • 通常在这里看到底是那些 wakelock 唤醒太多了.
  • 更多信息 -> Partial Wakelocks

Alarms 定时器/闹钟

  • 按照应用计数,每小时有多少个.
  • 这里看到 com.tencent.mm(微信) 有 4 个 alarm

Network

  • 每个应用网络访问的统计

CPU States

  • cpu 在各个频率的时间统计

Process

  • 各个应用进程的耗电统计,与系统内耗电排行类似

Sensors

  • 各个传感器的数据,类似光传感器,接近传感器,磁力计等等
  • 通常甚少有传感器故障导致的待机问题.但一旦发生,例如接近传感器(打电话靠到耳朵自动关屏的那个) 故障,导致大量唤醒,这个界面就能显示出来.

其他部分 bbs 的汉化应该都覆盖了,不再多说.

方案

上文说到的导致待机异常的原因一般都能用 bbs 排查出来.这里说说怎么解决.

硬件问题

  • 概率很小,但遇到就直接售后吧.

软件问题

  • Kernerl Wakelock:

    • 个人建议: 最好双清或者刷个更好的 Rom,别折腾了.内核级别的唤醒锁实在是超出一般折腾的范围.
    • 如果非要折腾:
      • 假如你刷了第三方内核且这个内核恰好支持 Wakelock Blocker,那么就能阻止内核唤醒锁.
      • 使用支持 Wakelock Blocker 的内核控制软件,例如 SmartPack-Kernel Manager 开始你的折腾,但是大概率是阻止了某个内核唤醒锁后,黑砖了….祝你好远…
  • Partial Wakelocks

    • 有 xposed -> deepsleep or nowakelock, android 版本过低 -> amplify
    • 没有 xposed 有 magisk -> WakeBlock 但是停更 2 年了,刷入 magisk 模块,与最新版 magisk 兼容性未测试.
    • 连 magisk 都没有,尝试 appops 禁用应用的保持唤醒 和 后台限制 权限.
  • Alarm

    • 这个必须要有 xposed 了,deepsleep or nowakelock, android 版本过低 -> amplify
  • Sensors

    • 传感器甚少发生故障,如果此项不正常,还是建议售后.

deepsleep 与 nowakelock 区别

  • 阻止 wakelock/alarm 方面,nowakelock 有延迟选项. deepsleep 只能一刀切禁掉 wakelock/alarm.
  • nowakelock 可以比较方便管理单个 wakelock/alarm. deepsleep 尽管在设置 -> 拓展选项开启后,也能做到,但是比较繁琐.
  • nowakelock 目前尚在 beta 版,还有很多 bug, 二选一,个人更推荐 deepsleep. nowakelock 稳定版还需至少半年时间.

一个例子(deepsleep 为例)

按照上面正常安装 bbs ,确保 bbs 权限检查界面没有红的.(设置 -> 高级 -> App Perssions)

右上角 -> 设置自定义区间,开始关屏待机测试.

到达预定时间,开屏看数据.

将第二个菜单,即开始时间设置为 Custom,第三个菜单,即结束时间设置为 Current.查看 各个项目的数据

  • 这里能看到支付宝的随机 alarm.

此时需要在 deepsleep 里禁掉支付宝的随机 alarm

deepsleep -> 设置 -> 实验功能.拓展功能 开启.

主界面长按支付宝那一行进入拓展选项-定时器

  • 拦截-正则表达式输入 ALARM_ACTION\([0-9]+\)
  • 相当于支付宝的一切符合 ALARM_ACTION\([0-9]+\) 的 alarm 都会被拦截.

deepsleep 备注

  • 看上面的 wakelock/alarm 有想保留的.在 白名单 输入全名,保存.
  • 绝对不想出现的 黑名单 输入全名 保存.
  • 优先级: 白名单 > 黑名单 > 正则 > 主界面的应用全局设置.

bbs 备注

  • 具体数据显示,长按可以复制对应文本.

尾巴

实际上在 android 引入强制 Doze 后,对应用后台的限制越来越严格,已经很难出现离谱的待机耗电问题了,Android 玩机圈也越发小众.

曾经 酷安 amplify bbs and etc 的评论区有非常多重要的信息,但当最终应用吧也消失后,这些信息也就没有着落了.

应该到最后都是这个结果吧.