[安卓休眠机制疑问] Android 的 cpu 在系统休眠时会关闭一些核心吗?

2021-06-09 06:37:51 +08:00
 zictos

之前在网上看过一些文章,有的说安卓有两个处理器,休眠时会关闭一个处理器:

--安卓有两个处理器 AP 与 BP,系统休眠中的 CPU 停止指的是 AP 处理器,而 BP 处理器处于正常工作的状态

上面这段话的意思是整个 AP 处理器都停止吗?可是我试着在后台跑 shell 脚本发现 shell 脚本居然可以一直成功执行,也没要任何唤醒锁之类的。如果 cpu 真的停止了,那 shell 脚本真的还能一直运行?另外手机还可以安装 ssh 服务、ftp 服务、adb 服务,这些服务在手机锁屏后也随时都可以连接,如果 cpu 停止了也能做到?

.

比较说得通的休眠省电方式应该是关闭 cpu 的一些核心,比如 8 核 cpu 在休眠时关闭 4 个核心,只留 4 个核心运行。
下面是通过 adb 命令查看 cpu 的 online 文件:

cat /sys/devices/system/cpu/cpu3/online

上面的命令是针对 cpu 的第四个核心,如果上面的命令执行结果是 1,就代表 cpu 的第四个核心是在线状态。如果是 0,就代表是离线状态。

root 后,有的手机可通过修改该文件为 0 的方式让 cpu 强制离线,有的手机不行:

echo 0 > /sys/devices/system/cpu/cpu3/online

只是我在手机锁屏很久后通过 adb 命令查看 online 文件,发现 cpu 的所有核心都一直是以最小频率在运行。根本就没关闭任何核心。所以不知道到底是否会关闭,还是说由于我连接了 adb 才没关闭?如果能关闭一些核心的话应该会省电很多。

9375 次点击
所在节点    Android
14 条回复
vk42
2021-06-09 07:25:22 +08:00
这都是系统自己处理的,你非要替系统操这个心干嘛……
dingwen07
2021-06-09 07:27:18 +08:00
你在后台跑 shell 的时候系统应该是唤醒的,你可以去电源管理看
airqj
2021-06-09 07:29:36 +08:00
关闭核心应该说的是不再参与进程的调度,对于用户来说是感知不到的
写个程序绑定到核心试试看
zictos
2021-06-09 07:40:22 +08:00
@vk42 #1 如果能弄懂再借助一些手段的话或许能大幅提升待机时间, 有些人的手机可能很少或根本没进入深度睡眠状态(各种各样的原因), 这就是不同人的手机待机时间差别可以很大的原因。
很少有人研究这个,以致于自己的手机到底有没有进入深度睡眠状态,什么时候进入的,什么时候退出的都无法知道。比如晚上睡觉 7 个小时,我想知道手机到底有几个小时是深度睡眠状态,正常应该是几个小时的深度睡眠状态。如果有异常,怎么解决。
vk42
2021-06-09 07:54:47 +08:00
@zictos 很少有人研究是因为大多数终端用户并不关心这个,虽然续航是个关键痛点。但对开发者来说 G 有电源管理的指导,另外最近几个 Android 版本已经能对大多阻止设备进入 doze 状态的 app 作出反应了。你要感兴趣的话可以去 play store 上下个 doze mode 的统计软件研究一下
kokutou
2021-06-09 08:22:31 +08:00
root 后开个 top 一看就知道了,你会发现在后台吃 CPU 的全是各种 app,装个绿色守护全部忽略前台后台状态直接杀掉,你的手机就又流畅又省电。

还轮不到什么系统级优化那一步。
sky96111
2021-06-09 08:35:06 +08:00
@zictos Play 商店有个叫 BatteryGuru 的软件,可以监测深度休眠的时间。如果遇到异常唤醒,这个软件可以看到唤醒锁的时长,再通过 Wakeblock (需要 root )或者 nowakelock 、deepsleep (需要 Xposed )。再不济也可以用 ADB 的命令强制手动进入 Doze
zictos
2021-06-09 08:49:13 +08:00
@kokutou #6 关键是不知道系统到底有没有休眠,cpu 是否还在工作。
cpu 最低频率运行也有几百 MHz,功率不低了。
zictos
2021-06-09 08:54:10 +08:00
@sky96111 #7 如果 cpu 都停止工作了,BatteryGuru 又是怎么检测的呢?读日志吗?
如果说取消 BatteryGuru 的电池优化让它在后台可以工作,那有程序在后台工作还能说明系统在深度睡眠吗?其他程序要唤醒锁,BatteryGuru 要不要唤醒锁呢?
adb 命令进入 Doze,但查看 cpu 还是都在工作并且频率还不低。不开 adb 又什么都看不到。
yukiww233
2021-06-09 09:17:16 +08:00
zictos
2021-06-09 09:25:15 +08:00
@yukiww233 #10
总共 108 个小时,那要看你亮屏时间是多少小时。正常来说熄屏后应该只有很少时间不是深度休眠。
只是我实在是不理解,所谓的深度睡眠就真的是 cpu 完全不工作吗?至少我通过 adb 是查看到一直在工作的,除非 adb 断开就不工作了。但我发现不管连不连 adb,手机耗电似乎差不多。
sky96111
2021-06-09 09:26:34 +08:00
@zictos 深度休眠不会也不能关闭所有 CPU…内核支持 CPU 热插拔系统可能会关闭一些核心降低功耗。BatteryGuru 不检测 CPU,只检测深度休眠,通过读取 dump 状态。深度休眠有白名单,进入深度休眠不代表后台完全无程序运行,几百 MHz 正常
Yoocai
2021-06-09 09:32:15 +08:00
应该是关核心+降频,
以前诺基亚的时候有 AP+BP 的区分,BP 有休眠时钟可以实现关机闹铃功能。
高通出来后合在一起叫 Soc,早期高通平台不支持关机闹铃,至少我用的联想 A60 是这样,后来用德仪平台的戴妃好像也不行。也许现在的高通关机也只是软关机,要硬件复位也得重启或者断电
killeder
2021-06-09 13:21:47 +08:00
AP 会休眠,BP 也会休眠

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/782287

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX