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休眠机制相关推荐

  1. android 休眠app,Android 12或让未使用的App休眠以节省系统资源

    原标题:Android 12或让未使用的App休眠以节省系统资源 来源:cnBeta.COM XDA-Developers 报道称,距离 Android 12 首个开发者预览版本的到来,只有一个月多的 ...

  2. android wifi 休眠策略,Android wifi休眠策略

    本文转自http://blog..net/wwwwap2008/article/details/51783138 最近在项目里发现一段logcat: W/Settings: Setting wifi_ ...

  3. android app防止锁屏_设置Android系统永不锁屏永不休眠的方法

    在进行Android系统开发的时候,有些特定的情况需要设置系统永不锁屏,永不休眠.本篇文章给大家介绍Android 永不锁屏,开机不锁屏,删除设置中休眠时间选项,需要的朋友一起学习吧. Android ...

  4. 编程android控制休眠时间,Android设置锁屏/休眠时长

    这个有两个方式: 一种是直接使用api修改: 另一种是修改系统数据库: 调用api需要添加权限,而修改数据库不用. 1.api设置 Settings.System.putInt(getContentR ...

  5. Android/linux(earlysuspend、lateresume)睡眠唤醒机制简

    来源处 http://blog.sina.com.cn/s/blog_759dc36b0100stax.html 背景介绍: 睡眠/唤醒是嵌入式Linux非常重要的组成部分,因为优秀的睡眠唤醒机制可以 ...

  6. Android 8.1 PowerManagerService分析(三)——WakeLock机制

    欢迎大家关注我的掘金帐号 我会在那里定期更新最新版本的Android Framework源码模块分析~~ 在Android 8.1 PowerManagerService分析(一)中,主要分析了PMS ...

  7. 从Android源码的角度分析Binder机制

    IPC 为了弄懂IPC的来龙去脉,我将从以下三个方面为大家来讲解,希望对大家理解IPC会有帮助 什么是IPC IPC是Inter Process Communication的缩写,其意思就是进程间的通 ...

  8. 《Android 开发艺术探索》笔记2--IPC机制

    <Android 开发艺术探索>笔记2--IPC机制 思维导图 Android IPC简介 Android中的多进程的模式 IPC基础概念 Serializable接口 Parcelabl ...

  9. 【Android 文件管理】分区存储 ( 分区存储机制 和 文件索引数据 )

    文章目录 一.Android 10 以前的存储机制 二.Android 10 及以后的分区存储机制 三.Android 10 中的存储过渡方案 四.文件索引数据库 五.相关文档资料 一.Android ...

  10. 【Android 进程保活】Low Memory Killer 机制

    文章目录 一.Low Memory Killer 机制 二.Low Memory Killer 参数 一.Low Memory Killer 机制 Android 中有一套 Low Memory Ki ...

最新文章

  1. 最强 NLP 预训练模型库 PyTorch-Transformers 正式开源:支持 6 个预训练框架,27 个预训练模型...
  2. 基于Android移动终端的微型餐饮管理系统的设计与实现4——Android基础
  3. Gnuplot使用x11终端自动注销问题
  4. 【PC工具】几个电脑录屏相关软件,手机投屏电脑,电脑显示手机摄像头图像,必须好用无广告!...
  5. des解密不完整,前面几位是乱码的解决办法
  6. 算法与数据结构(python):堆与堆排序
  7. std::unique_lock与std::lock_guard区别示例
  8. ubuntu 安装ssh服务
  9. 3.1Guessing Game
  10. 官方华为鸿蒙os正式推送的版本,鸿蒙OS 2.0他来了!华为HarmonyOS 2.0开发者公测版正式推送...
  11. 使用DAO模式开发宠物管理系统---hellokitty
  12. JavaScript Object 及相关操作
  13. 打开TestFlight并链接到具体的应用下载界面
  14. JavaScript——监听事件:点击鼠标,视频静音(原神官网)
  15. Oracle锁表查看及处理
  16. 计161--Problem H: 求三角形面积-gyy
  17. Gitee码云注册和提交代码
  18. c-free语言编程软件,c-free软件下载_c-free官方下载_3DM软件
  19. 外贸版ChatGPT,每天节省5小时开发客户时间,可以用来干这些事情
  20. 牛客网C语言刷题(三)

热门文章

  1. react在线浏览doc_如何实现 React 中的状态自动保存?
  2. 【Unity】 HTFramework框架(十七)Hotfix热更新模块
  3. 基于Python实现的远程控制主机设计
  4. 英语面试技巧以及准备工作
  5. 区块链钱包,新一代支付宝?|筱静观察
  6. 离谱!诺奖得主被曝40多篇论文造假!还涉及国内高校学者!
  7. 经典回味:ResNet到底在解决一个什么问题呢?
  8. 游戏编程精粹1---数学技巧---可预测随机数---2
  9. 布控球可接入电网安全接入平台及电网统一视频
  10. 状态栏RAT信号图标显示