android休眠状态,【Android休眠】之Android休眠机制
https://www.cnblogs.com/linhaostudy/p/12113548.html
阅读目录
正文
一、休眠概述
休眠,简而言之就是设备在不需要工作的时候把一些部件、外设关掉(掉电或让它进入低功耗模式)。
为什么要休眠呢?一言以蔽之:省电。
休眠分主动休眠和被动休眠。主动休眠:比如我电脑不用了,就通过设置让系统进入休眠模式;被动休眠:系统检测到自己闲的慌,为了节约故,自己就休眠去了。
废话不叙。
二、Android休眠
休眠是内核的核心工作,而Android是基于Linux内核的,所以Android休眠和内核有着千丝万缕的联系;由于Android的特殊应用场景:移动设备,所以Android休眠和内核又有着特别的需求。
1、联系:
Android设备停止使用,系统没有什么事情可做,进入休眠状态的功能最终是由内核去实现的;每一类硬件都有自己的驱动,具体的驱动决定怎么进入休眠以及处于何种层次的休眠。比如:对于platform_device,就按照platform_driver定义的规则,在suspend调用的时候,去做上面提到的事情:
structplatform_driver {int(*probe)(structplatform_device *);int(*remove)(structplatform_device *);void(*shutdown)(structplatform_device *);int(*suspend)(structplatform_device *, pm_message_t state);int(*resume)(structplatform_device *);structdevice_driver driver;conststructplatform_device_id *id_table;};
2、Android的特别需求:
比如对于自己的电脑,不用让它休眠好了;但是对于我们形影不离的手机,在休眠的时候还要睁一只眼:来电了要通知你,QQ啊微信啊什么的由信息了也要通知你,所以Android在Linux内核休眠机制之上,提出了“Opportunistic Suspend”。
三、休眠实践
絮絮叨叨这么多,下面让我们切切实实体验下休眠。
1、休眠模式
休眠是分好几种模式的,不同模式实现方式、耗电量不同,以下来自Documentation/power/states.txt:
The kernel supports four power management states generically, thoughoneisgenericandthe other three are dependentonplatform supportcodetoimplement the low-level detailsforeachstate.This file describeseachstate, what they arecommonly called, what ACPI state they mapto,andwhatstringtowriteto/sys/power/statetoenter that state state:Freeze / Low-Power IdleACPI state:S0String:"freeze"This stateisa generic, pure software, light-weight, low-power state.It allows more energytobe saved relativetoidlebyfreezing userspaceandputting all I/O devicesintolow-power states (possiblylower-power than available at run time), such that the processors canspend more timeintheir idle states.This state can be usedforplatforms without Standby/Suspend-to-RAMsupport,orit can be usedinadditiontoSuspend-to-RAM (memory sleep)toprovide reducedresumelatency. State:Standby / Power-OnSuspendACPI State:S1String:"standby"This state offers minimal, though real, power savings,whileprovidinga very low-latency transition backtoa working system. No operatingstateislost (the CPU retains power), so the system easily starts upagainwhereit leftoff. Wetrytoput devicesina low-power state equivalenttoD1, whichalso offers low power savings, but lowresumelatency.Notall devicessupport D1,andthose that don't are left on. State:Suspend-to-RAMACPI State:S3String:"mem"This state offers significant power savingsaseverythinginthesystemisputintoa low-power state, exceptformemory, whichisplacedinself-refresh modetoretain its contents. Systemanddevice stateissavedandkeptinmemory. All devices aresuspendedandputintoD3.Inmany cases, all peripheral buses losepowerwhenentering STR, so devices must be abletohandle thetransition backtotheOnstate.Forat least ACPI, STR requires some minimal boot-strapping codetoresumethe systemfromSTR. This may betrueonother platforms. State:Suspend-to-diskACPI State:S4String:"disk"This state offers the greatest power savings,andcan be used eveninthe absenceoflow-level platform supportforpower management. Thisstate operates similarlytoSuspend-to-RAM, but includes a finalstepofwriting memory contentstodisk.Onresume, thisisreadandmemoryisrestoredtoits pre-suspend state.
虽说kernel支持上述四种休眠模式,但具体哪几种可用取决于你的硬件。那么怎么知道自己的Android设备支持的休眠模式呢?
答案:通过/sys/文件系统。查询支持的休眠模式可以cat文件/sys/power/state:
cat/sys/power/state freeze mem
如果我们往/sys/power/state文件echo上面的某一种模式的字符串,系统就会进入相应的休眠模式:
echo"mem">/sys/power/state
如果你搜索过Android休眠相关的内容,在老版本的Android(4.4版本之前)会见有提到PowerManager的setPowerState()方法,该方法即是通过以上方式使系统进入休眠。但自从引入Autosleep后,就不在这么做了,setPowerState()方法也销声匿迹。
2、/sys/power/目录下文件
文件简介:
/sys/power/state:用来控制系统的Power状态。读取该文件可以获取系统支持的休眠模式,写入该文件休眠模式的一种,系统进入到指定的休眠模式。如上所示例。
/sys/power/autosleep:从Android wakelocks补丁集中演化而来,用于取代Android
wakelocks中的自动休眠功能。向该文件写入/sys/power/state返回值的某一种,系统会在适当的时候进入指定的休眠的模式;读取该文件返回之前写入的数值。
/sys/power/wake_lock、/sys/power/wake_unlock:即我们常说的休眠锁,如果应用持有休眠锁,系统将无法进入休眠模式。在Android
wakelocks时代,写wake_lock获取锁,写wake_unlock释放锁;在AutoSleep时代,具体参见【Android休眠】之AutoSleep
wakeup_count:用于解决“system suspend和system wakeup events之间的同步问题”。
/sys/power/pm_async:状态切换开关,允许/禁止User空间对设备进行异步的suspend和resume操作。
/sys/power/pm_freeze_timeout:系统在执行休眠动作的时候要冻结(freeze)用户控件的进程和内核空间的允许冻结的内核线程,执行这些操作要耗时间吧?该文件指定所需时间的最大值。
四、其他需要明了的问题
1、Android设备屏幕暗下来的时候,并不是立即就进入了休眠模式;当所有唤醒源都处于de-avtive状态后,系统才会进入休眠。
2、Android设备连着adb线到其他设备的情况下,设备是不会进入休眠模式的。
3、有休眠操作就有唤醒,就需要唤醒源。唤醒源有很多种,在内核注册,比如常用的Power按键。
4、曾经困惑的一个问题:系统怎么知道自己应该进入休眠模式了?它的判断依据是什么?
在wakelock时代,系统休眠过程中去检测休眠锁;如果系统中没有其他部件持有休眠锁,就尝试进入休眠模式,没有异常事件发生的话就进入休眠模式。
Android从4.4开始使用autosleep机制,只要不存在任何active的唤醒源(wakeup_source)了,就进入休眠模式。
5、系统Power Manager整体流程:
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!
android休眠状态,【Android休眠】之Android休眠机制相关推荐
- android 休眠app,Android 12或让未使用的App休眠以节省系统资源
原标题:Android 12或让未使用的App休眠以节省系统资源 来源:cnBeta.COM XDA-Developers 报道称,距离 Android 12 首个开发者预览版本的到来,只有一个月多的 ...
- android wifi 休眠策略,Android wifi休眠策略
本文转自http://blog..net/wwwwap2008/article/details/51783138 最近在项目里发现一段logcat: W/Settings: Setting wifi_ ...
- android app防止锁屏_设置Android系统永不锁屏永不休眠的方法
在进行Android系统开发的时候,有些特定的情况需要设置系统永不锁屏,永不休眠.本篇文章给大家介绍Android 永不锁屏,开机不锁屏,删除设置中休眠时间选项,需要的朋友一起学习吧. Android ...
- 编程android控制休眠时间,Android设置锁屏/休眠时长
这个有两个方式: 一种是直接使用api修改: 另一种是修改系统数据库: 调用api需要添加权限,而修改数据库不用. 1.api设置 Settings.System.putInt(getContentR ...
- Android/linux(earlysuspend、lateresume)睡眠唤醒机制简
来源处 http://blog.sina.com.cn/s/blog_759dc36b0100stax.html 背景介绍: 睡眠/唤醒是嵌入式Linux非常重要的组成部分,因为优秀的睡眠唤醒机制可以 ...
- Android 8.1 PowerManagerService分析(三)——WakeLock机制
欢迎大家关注我的掘金帐号 我会在那里定期更新最新版本的Android Framework源码模块分析~~ 在Android 8.1 PowerManagerService分析(一)中,主要分析了PMS ...
- 从Android源码的角度分析Binder机制
IPC 为了弄懂IPC的来龙去脉,我将从以下三个方面为大家来讲解,希望对大家理解IPC会有帮助 什么是IPC IPC是Inter Process Communication的缩写,其意思就是进程间的通 ...
- 《Android 开发艺术探索》笔记2--IPC机制
<Android 开发艺术探索>笔记2--IPC机制 思维导图 Android IPC简介 Android中的多进程的模式 IPC基础概念 Serializable接口 Parcelabl ...
- 【Android 文件管理】分区存储 ( 分区存储机制 和 文件索引数据 )
文章目录 一.Android 10 以前的存储机制 二.Android 10 及以后的分区存储机制 三.Android 10 中的存储过渡方案 四.文件索引数据库 五.相关文档资料 一.Android ...
- 【Android 进程保活】Low Memory Killer 机制
文章目录 一.Low Memory Killer 机制 二.Low Memory Killer 参数 一.Low Memory Killer 机制 Android 中有一套 Low Memory Ki ...
最新文章
- 最强 NLP 预训练模型库 PyTorch-Transformers 正式开源:支持 6 个预训练框架,27 个预训练模型...
- 基于Android移动终端的微型餐饮管理系统的设计与实现4——Android基础
- Gnuplot使用x11终端自动注销问题
- 【PC工具】几个电脑录屏相关软件,手机投屏电脑,电脑显示手机摄像头图像,必须好用无广告!...
- des解密不完整,前面几位是乱码的解决办法
- 算法与数据结构(python):堆与堆排序
- std::unique_lock与std::lock_guard区别示例
- ubuntu 安装ssh服务
- 3.1Guessing Game
- 官方华为鸿蒙os正式推送的版本,鸿蒙OS 2.0他来了!华为HarmonyOS 2.0开发者公测版正式推送...
- 使用DAO模式开发宠物管理系统---hellokitty
- JavaScript Object 及相关操作
- 打开TestFlight并链接到具体的应用下载界面
- JavaScript——监听事件:点击鼠标,视频静音(原神官网)
- Oracle锁表查看及处理
- 计161--Problem H: 求三角形面积-gyy
- Gitee码云注册和提交代码
- c-free语言编程软件,c-free软件下载_c-free官方下载_3DM软件
- 外贸版ChatGPT,每天节省5小时开发客户时间,可以用来干这些事情
- 牛客网C语言刷题(三)