V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zictos
V2EX  ›  Android

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

  •  
  •   zictos · 181 天前 · 1744 次点击
    这是一个创建于 181 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    --安卓有两个处理器 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 才没关闭?如果能关闭一些核心的话应该会省电很多。

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

    还轮不到什么系统级优化那一步。
    sky96111
        7
    sky96111  
       181 天前   ❤️ 2
    @zictos Play 商店有个叫 BatteryGuru 的软件,可以监测深度休眠的时间。如果遇到异常唤醒,这个软件可以看到唤醒锁的时长,再通过 Wakeblock (需要 root )或者 nowakelock 、deepsleep (需要 Xposed )。再不济也可以用 ADB 的命令强制手动进入 Doze
    zictos
        8
    zictos  
    OP
       181 天前
    @kokutou #6 关键是不知道系统到底有没有休眠,cpu 是否还在工作。
    cpu 最低频率运行也有几百 MHz,功率不低了。
    zictos
        9
    zictos  
    OP
       181 天前
    @sky96111 #7 如果 cpu 都停止工作了,BatteryGuru 又是怎么检测的呢?读日志吗?
    如果说取消 BatteryGuru 的电池优化让它在后台可以工作,那有程序在后台工作还能说明系统在深度睡眠吗?其他程序要唤醒锁,BatteryGuru 要不要唤醒锁呢?
    adb 命令进入 Doze,但查看 cpu 还是都在工作并且频率还不低。不开 adb 又什么都看不到。
    yukiww233
        10
    yukiww233  
       181 天前
    zictos
        11
    zictos  
    OP
       181 天前
    @yukiww233 #10
    总共 108 个小时,那要看你亮屏时间是多少小时。正常来说熄屏后应该只有很少时间不是深度休眠。
    只是我实在是不理解,所谓的深度睡眠就真的是 cpu 完全不工作吗?至少我通过 adb 是查看到一直在工作的,除非 adb 断开就不工作了。但我发现不管连不连 adb,手机耗电似乎差不多。
    sky96111
        12
    sky96111  
       181 天前 via Android
    @zictos 深度休眠不会也不能关闭所有 CPU…内核支持 CPU 热插拔系统可能会关闭一些核心降低功耗。BatteryGuru 不检测 CPU,只检测深度休眠,通过读取 dump 状态。深度休眠有白名单,进入深度休眠不代表后台完全无程序运行,几百 MHz 正常
    Yoocai
        13
    Yoocai  
       181 天前
    应该是关核心+降频,
    以前诺基亚的时候有 AP+BP 的区分,BP 有休眠时钟可以实现关机闹铃功能。
    高通出来后合在一起叫 Soc,早期高通平台不支持关机闹铃,至少我用的联想 A60 是这样,后来用德仪平台的戴妃好像也不行。也许现在的高通关机也只是软关机,要硬件复位也得重启或者断电
    killeder
        14
    killeder  
       181 天前
    AP 会休眠,BP 也会休眠
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2719 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 12:50 · PVG 20:50 · LAX 04:50 · JFK 07:50
    ♥ Do have faith in what you're doing.