【Android休眠】之Android休眠机制

2024-05-07 02:18
文章标签 android 机制 休眠

本文主要是介绍【Android休眠】之Android休眠机制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

随时随地技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)

转自:【Android休眠】之Android休眠机制___2017__的博客-CSDN博客_android系统休眠机制

一、休眠概述

休眠,简而言之就是设备在不需要工作的时候把一些部件、外设关掉(掉电或让它进入低功耗模式)。

为什么要休眠呢?一言以蔽之:省电。

休眠分主动休眠和被动休眠。主动休眠:比如我电脑不用了,就通过设置让系统进入休眠模式;被动休眠:系统检测到自己闲的慌,为了节约故,自己就休眠去了。

废话不叙。

二、Android休眠

休眠是内核的核心工作,而Android是基于Linux内核的,所以Android休眠和内核有着千丝万缕的联系;由于Android的特殊应用场景:移动设备,所以Android休眠和内核又有着特别的需求。

1、联系:

Android设备停止使用,系统没有什么事情可做,进入休眠状态的功能最终是由内核去实现的;每一类硬件都有自己的驱动,具体的驱动决定怎么进入休眠以及处于何种层次的休眠。比如:对于platform_device,就按照platform_driver定义的规则,在suspend调用的时候,去做上面提到的事情:

[cpp] view plain copy

  1. struct platform_driver {  
  2.     int (*probe)(struct platform_device *);  
  3.     int (*remove)(struct platform_device *);  
  4.     void (*shutdown)(struct platform_device *);  
  5.     int (*suspend)(struct platform_device *, pm_message_t state);  
  6.     int (*resume)(struct platform_device *);  
  7.     struct device_driver driver;  
  8.     const struct platform_device_id *id_table;  
  9. };  

2、Android的特别需求:

比如对于自己的电脑,不用让它休眠好了;但是对于我们形影不离的手机,在休眠的时候还要睁一只眼:来电了要通知你,QQ啊微信啊什么的由信息了也要通知你,所以Android在Linux内核休眠机制之上,提出了“Opportunistic Suspend”。

三、休眠实践

絮絮叨叨这么多,下面让我们切切实实体验下休眠。

1、休眠模式

休眠是分好几种模式的,不同模式实现方式、耗电量不同,以下来自Documentation/power/states.txt:

[html] view plain copy

  1. The kernel supports four power management states generically, though  
  2. one is generic and the other three are dependent on platform support  
  3. code to implement the low-level details for each state.  
  4. This file describes each state, what they are  
  5. commonly called, what ACPI state they map to, and what string to write  
  6. to /sys/power/state to enter that state  
  7.   
  8. state:      Freeze / Low-Power Idle  
  9. ACPI state: S0  
  10. String:     "freeze"  
  11.   
  12. This state is a generic, pure software, light-weight, low-power state.  
  13. It allows more energy to be saved relative to idle by freezing user  
  14. space and putting all I/O devices into low-power states (possibly  
  15. lower-power than available at run time), such that the processors can  
  16. spend more time in their idle states.  
  17. This state can be used for platforms without Standby/Suspend-to-RAM  
  18. support, or it can be used in addition to Suspend-to-RAM (memory sleep)  
  19. to provide reduced resume latency.  
  20.   
  21.   
  22. State:      Standby / Power-On Suspend  
  23. ACPI State: S1  
  24. String:     "standby"  
  25.   
  26. This state offers minimal, though real, power savings, while providing  
  27. a very low-latency transition back to a working system. No operating  
  28. state is lost (the CPU retains power), so the system easily starts up  
  29. again where it left off.   
  30.   
  31. We try to put devices in a low-power state equivalent to D1, which  
  32. also offers low power savings, but low resume latency. Not all devices  
  33. support D1, and those that don't are left on.   
  34.   
  35.   
  36. State:      Suspend-to-RAM  
  37. ACPI State: S3  
  38. String:     "mem"  
  39.   
  40. This state offers significant power savings as everything in the  
  41. system is put into a low-power state, except for memory, which is  
  42. placed in self-refresh mode to retain its contents.   
  43.   
  44. System and device state is saved and kept in memory. All devices are  
  45. suspended and put into D3. In many cases, all peripheral buses lose  
  46. power when entering STR, so devices must be able to handle the  
  47. transition back to the On state.   
  48.   
  49. For at least ACPI, STR requires some minimal boot-strapping code to  
  50. resume the system from STR. This may be true on other platforms.   
  51.   
  52.   
  53. State:      Suspend-to-disk  
  54. ACPI State: S4  
  55. String:     "disk"  
  56.   
  57. This state offers the greatest power savings, and can be used even in  
  58. the absence of low-level platform support for power management. This  
  59. state operates similarly to Suspend-to-RAM, but includes a final step  
  60. of writing memory contents to disk. On resume, this is read and memory  
  61. is restored to its pre-suspend state.   


虽说kernel支持上述四种休眠模式,但具体哪几种可用取决于你的硬件。那么怎么知道自己的Android设备支持的休眠模式呢?

答案:通过/sys/文件系统。查询支持的休眠模式可以cat文件/sys/power/state:

[cpp] view plain copy

  1. cat /sys/power/state   
  2. freeze mem  

如果我们往/sys/power/state文件echo上面的某一种模式的字符串,系统就会进入相应的休眠模式:

[cpp] view plain copy

  1. 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休眠机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/966051

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

【Tools】大模型中的自注意力机制

摇来摇去摇碎点点的金黄 伸手牵来一片梦的霞光 南方的小巷推开多情的门窗 年轻和我们歌唱 摇来摇去摇着温柔的阳光 轻轻托起一件梦的衣裳 古老的都市每天都改变模样                      🎵 方芳《摇太阳》 自注意力机制(Self-Attention)是一种在Transformer等大模型中经常使用的注意力机制。该机制通过对输入序列中的每个元素计算与其他元素之间的相似性,

如何通俗理解注意力机制?

1、注意力机制(Attention Mechanism)是机器学习和深度学习中一种模拟人类注意力的方法,用于提高模型在处理大量信息时的效率和效果。通俗地理解,它就像是在一堆信息中找到最重要的部分,把注意力集中在这些关键点上,从而更好地完成任务。以下是几个简单的比喻来帮助理解注意力机制: 2、寻找重点:想象一下,你在阅读一篇文章的时候,有些段落特别重要,你会特别注意这些段落,反复阅读,而对其他部分

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk