首先我们手机灭屏后,一般需要等一段时间CPU才真正进入休眠。即Android设备屏幕暗下来的时候,并不是立即就进入了休眠模式;当所有唤醒源都处于de-avtive状态后,系统才会进入休眠。在手机功耗中从灭屏开始到CPU进入休眠时间越短,则待机场景越省电。
Android设备是如何进入休眠的呢?
答:Android提出了“Opportunistic suspend”的理论,通俗的讲,就是“逮到机会就睡”,“Opportunistic suspend”思想是非常简单的,只要检测到系统没有事情在做(逮到机会),就suspend整个系统。这对系统的开发人员(特别是driver开发者)来说,很容易实现,几乎不需要特别处理。但困难的是,“系统没有事情在做”的判断依据是什么?能判断准确吗?会不会浪费过多的资源在"susend->resume-supsend…”的无聊动作上?如果只有一个设备在做事情,其它设备岂不是也得陪着耗电?等等…
Android设备进入休眠的流程:
1.用户按下电源键:
用户通过按下电源键触发设备的休眠流程。
2.息屏超时:
设备屏幕在设定的时间内无操作后自动进入休眠状态。
3.AMS(Activity Manager Service)处理:
AMS负责管理Activity和Service的生命周期,调用它们的onPause和onStop方法,确保应用在休眠前保存数据。
4.应用保存数据:
应用在进入休眠前保存当前状态和数据,以防止数据丢失。
5.检查是否存在持锁:
系统检查是否存在阻止设备进入休眠的锁(如唤醒锁)。
6.执行Early Suspend流程:
如果不存在持锁,系统开始执行早期挂起流程。
6.1关闭背光:首先关闭屏幕背光以降低功耗。
6.2停止扫描触摸:停止触摸屏的扫描功能,进一步减少功耗。
6.3 关闭摄像头等硬件模块
即提前关闭摄像头等高耗电硬件模块,以更快降低功耗。
7.关闭屏幕:
完全关闭屏幕显示。
8.停止传感器:
WiFi和BT低功耗模式:停止传感器的工作,并将WiFi和BT模块置于低功耗模式。
9.内核层处理:
9.1同步文件系统:
调用sys_sync,将缓存数据写入磁盘,确保数据不丢失。
9.2挂起设备:
遍历设备,调用suspend方法,将设备置于低功耗状态。
9.3进入STR(Suspend to RAM):
CPU进入低功耗状态,关闭大部分硬件,只保留必要的唤醒源(如按键、网络和RTC闹钟)。
10.CPU进入低功耗状态:
设备最终进入低功耗休眠状态,等待用户下一次唤醒。
Android休眠框架图
在Android自动休眠(Auto Sleep)机制涉及两个关键概念:Early Suspend 和 WakeLock。这两个机制共同管理设备的电源状态,以优化功耗和性能。
Early Suspend(预挂起机制)
Early Suspend 是Android电源管理中的一个机制,用于在设备进入完全休眠状态之前,提前关闭一些高耗电的硬件模块。这样可以更快地降低功耗,延长电池寿命。
1.触发条件:
当系统检测到用户按下电源键或屏幕超时,且没有应用持有唤醒锁(WakeLock)时,Early Suspend机制会被触发。
2.执行步骤:
2.1关闭背光:首先关闭屏幕背光,以减少功耗。
2.2停止触摸屏扫描:停止触摸屏的扫描功能,进一步降低功耗。
2.3关闭摄像头等硬件模块:提前关闭摄像头、USB等高耗电硬件模块。
3.目的:通过提前关闭这些硬件模块,系统可以更快地进入低功耗状态,而不需要等待所有设备都进入休眠状态。
WakeLock(唤醒锁机制)
WakeLock 是Android系统中用于防止设备进入休眠状态的机制。应用可以通过申请WakeLock来保持设备处于唤醒状态,以执行一些后台任务或保持屏幕常亮。
1.申请与释放:
1.1申请WakeLock:应用可以通过PowerManager申请WakeLock,以保持设备唤醒。
1.2释放WakeLock:当任务完成后,应用需要释放WakeLock,以允许设备进入休眠状态。
2.类型:
2.1阻止CPU进入suspend的WakeLock:保持CPU运行,但允许屏幕关闭。
2.2屏幕WakeLock:保持屏幕亮起,但允许CPU进入休眠。
3.管理:
3.1PowerManagerService:负责管理所有WakeLock的申请和释放。
3.2WakeLock Manager:在内核层管理WakeLock的状态,确保设备在适当的时候进入休眠。
协同工作
Early Suspend和 WakeLock 机制协同工作,以确保设备在不需要时进入低功耗状态,同时在需要时保持唤醒。
1.当所有WakeLock被释放时,系统会继续执行休眠流程,包括Early Suspend和最终的Linux Suspend。
2.如果存在任何WakeLock,系统将延迟进入休眠状态,直到所有WakeLock被释放。
通过这两个机制,Android系统能够在保证用户体验的同时,有效地管理设备的电源状态,延长电池寿命。