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
22022.06.19 初始
2023.01.05 更新一些内容
导语
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 | adb -d shell pm grant com.asksven.betterbatterystats_xdaedition android.permission.BATTERY_STATS |
如果你的手机有 root 到这一步就可以了,如果不行再执行下面命令
Andorid 9 及以上限制了非 sdk api 的访问,而这是 bbs 依赖的.因此继续执行
1 | SDK28 (Android 9) |
最终是保证 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 的评论区有非常多重要的信息,但当最终应用吧也消失后,这些信息也就没有着落了.
应该到最后都是这个结果吧.