一、休眠概述
休眠,简而言之就是设备在不需要工作的时候把一些部件、外设关掉(掉电或让它进入低功耗模式)。
为什么要休眠呢?一言以蔽之:省电。
休眠分主动休眠和被动休眠。主动休眠:比如用户通过设置让系统进入休眠模式;被动休眠:系统检测到自己闲的慌,为了节约功耗,自己就休眠去了。
二、Android 休眠原理
休眠是内核的核心工作,而 Android 是基于 Linux 内核的,所以 Android 休眠和内核有着千丝万缕的联系。由于 Android 的特殊应用场景:移动设备,所以 Android 休眠和内核又有着特别的需求。
1、联系
Android 设备停止使用,系统没有什么事情可做,进入休眠状态的功能最终是由内核去实现的。每一类硬件都有自己的驱动,具体的驱动决定怎么进入休眠以及处于何种层次的休眠。比如:对于 platform_device,就按照 platform_driver 定义的规则,在 suspend 调用的时候,去做上面提到的事情:
struct platform_driver {
int (*probe)(struct platform_device *);
int (*remove)(struct platform_device *);
void (*shutdown)(struct platform_device *);
int (*suspend)(struct platform_device *, pm_message_t state);
int (*resume)(struct platform_device *);
struct device_driver driver;
const struct platform_device_id *id_table;
};
2、Android 的特别需求
比如对于自己的电脑,不用让它休眠好了;但是对于我们形影不离的手机,在休眠的时候还要睁一只眼:来电了要通知你,QQ 啊微信啊什么的有信息了也要通知你,所以 Android 在 Linux 内核休眠机制之上,提出了'Opportunistic Suspend'(机会性挂起)。
三、休眠实践
下面让我们切切实实体验下休眠。
1、休眠模式
休眠是分好几种模式的,不同模式实现方式、耗电量不同,以下来自 Documentation/power/states.txt:
- Freeze / Low-Power Idle (ACPI S0): 通用软件轻量级低功耗状态。冻结用户空间,将 I/O 设备置于低功耗状态,使处理器能更多时间处于空闲态。适用于无 Standby/Suspend-to-RAM 支持的平台,或作为 STR 的补充以减少恢复延迟。
- Standby / Power-On Suspend (ACPI S1): 提供最小但真实的功耗节省,同时保持极低的延迟。CPU 保留供电,系统状态不丢失,易于快速启动。
- Suspend-to-RAM (ACPI S3, String: "mem"): 显著节省功耗。除内存外,系统所有部分进入低功耗状态,内存置于自刷新模式。设备和系统状态保存在内存中,外设通常断电,需处理上电恢复逻辑。


