https://blog.csdn.net/u013247461/article/details/85261027
http://blog.sina.com.cn/s/articlelist_2790628754_5_1.html
http://mini.eastday.com/mobile/191231024055844.html#
http://blog.sina.com.cn/s/blog_67d955460100xlyh.html
https://www.jianshu.com/p/cc553c9c75b0
================================================================================================
1.Linux 描述的电源状态
- On(on) S0 - Working 正常工作状态 s0的状态应该是freeze
- Standby (standby) S1 - CPU and RAM are powered but not executed
- Suspend to RAM(mem) S3 - RAM is powered and the running content is saved to RAM
- Suspend to Disk,Hibernation(disk) S4 - All content is saved to Disk and power down
Standby也属于睡眠的一种方式,属于浅睡眠。该模式下CPU并未断电,依旧可以接收处理某些特定事件,视具体设备而定,恢复至正常工作状态的速度也比STR更快,但也更为耗电。举个例子来说,以该方式进入睡眠时,后续通过点击键盘也能将系统唤醒。而以mem进入的睡眠为深度睡眠,只能通过中断唤醒设备唤醒系统,如电源键(此时按电源键,不会经过正常的开机流程的BIOS、BOOTLOAD等),此时按键盘是无法唤醒系统的。
S1状态简称standby状态,此状态下CPU处于低功耗状态,并且没有数据保存到RAM或者disk中,此状态待机和恢复通常很快。
S3 aka STR(suspend to ram),挂起到内存,简称待机。计算机将目前的运行状态等数据存放在内存,关闭硬 盘、外设等设备,进入等待状态。此时内存仍然需要电力维持其数据,但整机耗电很少。恢复时计算机从内存读出数据,回到挂起前的状态,恢复速度较快。对 DDR的耗电情况进行优化是S3性能的关键,大多数手持设备都是用S3待机。此状态下计算机会冻结所有的活动并将当前工作状态保存到RAM中,然后关闭屏幕进入低功耗模式,通常睡眠和唤醒需要几秒
S3 aka STR(suspend to ram),挂起到内存,简称待机。计算机将目前的运行状态等数据存放在内存,关闭硬 盘、外设等设备,进入等待状态。此时内存仍然需要电力维持其数据,但整机耗电很少。恢复时计算机从内存读出数据,回到挂起前的状态,恢复速度较快。对 DDR的耗电情况进行优化是S3性能的关键,大多数手持设备都是用S3待机。
挂起到内存,俗称待机、睡眠(Sleep),进入该状态,系统的主要工作如下:
1、将系统当前的运行状态等数据保存在内存中,此时仍需要向RAM供电,以保证后续快速恢复至工作状态
2、冻结用户态的进程和内核态的任务(进入内核态的进程或内核自己的task)
3、关闭外围设备,如显示屏、鼠标等,中断唤醒外设不会关闭,如电源键
4、CPU停止工作
S4 aka STD(suspend to disk),挂起到硬盘,简称休眠。把运行状态等数据存放在硬盘上某个文件或者某个特定的区域,关闭硬盘、外设等设备,进入关机状态。此时计算机完全关闭,不耗电。恢复时计算机从休眠文件/分区中读出数据,回到休眠前的状态,恢复速度较慢。电子书项目中,见过一款索尼的电子书,没有定义关机状态,只定义了S4,从而提高开机速度。
STD(Suspend to Disk):
挂起到硬盘,俗称休眠(Hibernation)将系统当前的运行状态等数据保存到硬盘上,并自动关机。下次开机时便从硬盘上读取之前保存的数据,恢复到休眠关机之前的状态。
譬如在休眠关机时,桌面打开了一个应用,那么下一次开机启动时,该应用也处于打开状态。而正常的关机-开机流程,该应用是不会打开的。
实际上待机(standby)与睡眠(mem)属于不同模式,但现在大多操作系统都不支持待机模式了,我们也习惯将待机等同于睡眠,睡眠属于STR,休眠属于STD,Android手机不支持休眠!!!Android开发者官网当中提到“idle state”,该如何理解,这个状态会对设备及我们的程序造成何种影响
================================================================================================
Android 中定义了几种低功耗状态:earlysuspend,suspend,hibernation。
earlysuspend 是一种低功耗的状态,某些设备可以选择进入某种功耗较低的状态,比如
LCD可以降低亮度或灭掉;
suspend是指除电源管理以外的其他外围模块以及cpu均不工作,只有内存保持自刷新的
状态;
hibernation 是指所有内存镜像都被写入磁盘中,然后系统关机,恢复后系统将能恢复到
“关机”之前的状态。
main.c文件是整个框架的入口。用户可以通过读写 sys文件/sys/power/state 实现控制系统进
入低功耗状态。用户对于/sys/power/state 的读写会调用到 main.c中的 state_store(),用户可
以写入const char * const pm_states[] 中定义的字符串, 比如“on” , “mem” , “standby” ,
“disk”。
echo mem > /sys/power/state 是系统进入suspend to ram
或者
echo standby > /sys/power/state
命令系统进入earlysuspend 状态,那些注册了early suspend handler 的驱动将依次进入各自
的earlysuspend 状态。
echo on > /sys/power/state
将退出early suspend状态
echo disk > /sys/power/state
命令系统进入hibernation状态
echo lockname > /sys/power/wake_lock
加锁“lockname”
echo lockname > /sys/power/wake_unlock
解锁“lockname”
上述是分别加锁和解锁的命令,一旦系统中所有 wakelock 被解锁,系统就会进入 suspend
状态,可见Android中原本使系统 suspend 的操作(echo mem > /sys/power/state 等)被替
换成使系统进入early suspend;而wake lock 机制成为用户命令系统进入suspend状态的唯
一途径。
================================================================================================
2.运行以下adb命令使系统进入Doze模式:
$ adb shell dumpsys battery unplug
$ adb shell dumpsys deviceidle step
你可能需要多次执行第二条命令,直到设备处于idle 状态。注意,第一条命令的意思是,拔去电源,即使现在正在插着usb调试,也不会充电。建议运行$ adb shell dumpsys battery reset,否则会出现手机充不上电的情况。
echo freeze mem > sys/power/state