首页 > 其他分享 >Android低功耗子系统的投票机制以及触发进入系统休眠的过程

Android低功耗子系统的投票机制以及触发进入系统休眠的过程

时间:2024-07-27 17:50:39浏览次数:12  
标签:Linux 低功耗 休眠 投票 autosleep wakeup Android 子系统

  • 从kernel角度看,系统是否进入休眠应该由内核来控制,因此Linux引入了 wakeup source以及autosleep机制
    image

    在内核中,使用wakeup source提供投票机制,让各个系统模块投票是否允许系统进入休眠,当所有的模块都投票允许系统进入休眠时,autosleep机制检测到这一情况,尝试让系统进入休眠。

  • 从Android角度看,系统是否进入休眠应该由上层应用决定,因此Android引入了Wakelocks以及SystemSuspend service
    image

    • 关于wakelocks的介绍,请参考:Wakelocks 框架设计与实现
    • 关于 SystemSuspend Service,可参考:SystemSuspend 服务
      • 代码路径:system/hardware/interfaces/suspend/1.0/default/
      • 该服务创建了两个线程:
        • 主线程:响应来自Client的请求以分配wakelock, 增加/减少 suspend counter
        • 挂起线程:控制系统的休眠,判断系统是否符合进入休眠的条件(在framework中的PowerManagerService.java会根据一些事件,比如息屏亮屏,动态开关autosuspend,从而动态开启/结束该挂起线程)
          image
          挂起线程的实现与autosleep的流程类似(但需要与主线程处理好suspend counter的同步问题),其伪代码可以参考如下:
           while (1) {
              do {
                ret = read(&cnt, "/sys/power/wakeup_count"); //一般会阻塞在此处,直到cnt为0
                if (ret) {
                     ret = write(cnt, "/sys/power/wakeup_count");
                } else {
                     countine;
                }
              } while (!ret);
        
              write("mem", "/sys/power/state");
        
              /* goto here after wakeup */
              ......
           }
        

    在Android应用层面上,使用wakelocks提供投票机制,让各个系统模块投票是否允许系统进入休眠,当所有的模块都投票允许系统进入休眠且PowerManagerService使能autosuspend时,SystemSuspend service中的挂起线程检测到这一情况,会尝试让系统进入休眠。

因Android提供了SystemSuspend service,因此autosleep机制一般不再使用,
但对于纯Linux系统,一般会使用autosleep机制来检测系统是否应尝试进入休眠。

关于Android低功耗子系统的投票机制以及触发进入系统休眠的过程,强烈建议在有此基础概念的基础上,拜读下面的文章,了解这些机制的发展过程,加深对这部分内容的理解:

  1. Linux电源管理(7)_Wakeup events framework
  2. Linux电源管理(8)_Wakeup count功能
  3. Linux电源管理(9)_wakelocks
  4. Linux电源管理(10)_autosleep

标签:Linux,低功耗,休眠,投票,autosleep,wakeup,Android,子系统
From: https://www.cnblogs.com/jiafan-ma/p/18279033

相关文章

  • ssm+vueAndroid共享停车位【开题+程序+论文】-计算机毕业设计
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着城市化进程的加速,私家车数量急剧增加,停车难问题日益凸显,尤其是在繁华商业区、医院、学校等热点区域,停车位供需矛盾尤为突出。传统的停车管理模式......
  • 在 Python 中获取精确的 Android GPS 位置
    我尝试在Python中获取Android手机的GPS位置(使用QPython3应用程序)。这种可行,但是Android中似乎有几个LocationProvider:gps:纯gps定位,速度慢,耗能,但非常准确,正是我所需要的。网络:GPS和wifi/小区定位的混合,更快,但不太准确被动......
  • 【Android驱动05】通过U-Boot来设置启动参数cmdline将数据传递给应用层的方法
    在Android系统中,通过U-Boot(通常称为uboot)来设置启动参数(如cmdline)或尝试直接将数据传递给应用层(通过系统属性property)是一个较为间接的过程,因为U-Boot主要负责硬件初始化和引导Linux内核,而Android系统属性则是由Android系统服务(如init进程和property服务)管理的。不过,我们可......
  • Android笔试面试题AI答之控件Views(6)
    答案来着文心一言,仅供参考目录1.简述什么是RemoteViews?使用场景有哪些?RemoteViews的特性使用场景总结2.获取View宽高的几种方法?1.在`onWindowFocusChanged`方法中获取2.使用`ViewTreeObserver.OnGlobalLayoutListener`3.使用`ViewTreeObserver.OnPreDrawListene......
  • STM32+ESP8266-连接阿里云-创建云产品流转实现STM32与Android app通讯(1)
    前言本文章的内容为STM32通过ESP8266利用AT指令连接阿里云平台,并创建设备和创建云产品流转主题,来为实现Androidapp与STM32的发送接收数据做准备。Androidapp的实现由于篇幅不宜过长,将放到下一篇文章中。演示视频实现一个简单的app来控制stm32开关灯、蜂鸣器、门(舵机),显示温......
  • Android 12.0 framework层实现点击空白处自动隐藏输入法功能
    1.前言 在12.0的系统rom产品定制化开发中,在进行一些定制开发中,在某些无源码的app中,如果app中没实现点击空白区域外自动隐藏输入法功能的时候,那么就需要在系统framework层中进行相关功能的开发,接下来看下相关功能的实现2.framework层实现点击空白处自动隐藏输入法功能的核......
  • 深入分析 Android ContentProvider (六)
    文章目录深入分析AndroidContentProvider(六)ContentProvider的性能优化和实践案例(续)1.性能优化技巧(续)1.6.使用批量插入优化性能示例:批量插入实现1.7.使用Projections优化查询示例:使用Projections1.8.减少频繁通知示例:减少频繁通知1.9.优化查询语句示例:优......
  • Android开发- 正则表达式Pattern类与Matcher类的解析与使用
    简介使用正则表达式需要用到两个类:Pattern类与Matcher类其中Pattern类用来制定匹配规则,而Matcher类用来接收需要进行匹配的字符串Pattern类Patternpattern=Pattern.compile(Stringregex);:Pattern类的创建方法参数解析:regex:取值类型为正则表达式字符串;设置匹配规则......
  • Android Compose 使用 照片选择器 Photo Picker
    从Android13(Tiramisu,API33)开始,官方提供了系统级图片选择器PhotoPicker。而且无需申请权限,只需几行代码即可轻松接入。效果如下图:在不支持PhotoPicker的低版本机型中,该库会自动调用ACTION_OPEN_DOCUMENT打开系统资源管理器进行选择,问题也不大。官方介绍and教程:Ph......
  • Android 将 ViewModel 和 Compose界面的数据 双向绑定
    简介双向绑定说白了就是达到下面的效果:ViewModel能够实时传输从Room数据库查询到的数据到Compose页面。Compose页面能实时传输用户输入的数据到ViewModel类。需要分别在ViewModel和Compose中操作。一、在ViewModel中:1、使用mutableStateOf家族定义一个可变的值(......