Android电源管理介绍

news2025/4/11 17:20:47

一、电源管理基础知识

1.1电源管理的几种状态

Android kernel源码中,定义了三种电源状态,在kernel/power/suspend.c中:

b6ead2e9386cef124976ce6d584a574a.png

对应的宏定义/include/linux/suspend.h

ef1b7e5f304cc61f8b1e0b2cfddb31f6.png

1.2 电源管理状态的介绍:

PM_SUSPEND_ON

设备处于正常工作状态

PM_SUSPEND_STANDBY

设备处于省电状态,但还可以接收某些事件

PM_SUSPEND_MEM

设备进入睡眠状态,保存系统运行的上下文至内存后挂起系统,只有特定外部中断才可以唤醒设备

PM_SUSPEND_TO_IDLE

设备进入空闲状态,冻结用户空间并将外围设备调至低耗电模式,强制将 CPU 进入idle

ADB 查看支持的电源模式

cat /sys/power/state

1.3 Idle State

Android的Idle状态分为二类:CPU Idle和Device Idle

CPU Idle

每一个 CPU 核心都会有一个 idle 进程,idle 进程是当系统没有调度 CPU 资源的时候,会进入 idle 进程,而 idle 进程的作用就是不使用 CPU,以此达到省电的目的。

有关CPU idle的内容可以查看公众号之前的文章《Linux Cpuidle介绍》

Device Idle

Device Idle属于android Doze模式中的概念,即指手机屏幕熄屏、不充电、静置不动

在 Doze 模式下,按照google的官方说法,Wakelocks,网络访问,jobshedule,闹钟,GPS/WiFi扫描都会停止。

5f1903544218b60010e2cc54c66bc598.png

系统会定期退出 Doze 一小段时间,让应用程序完成其延迟的活动。在此维护窗口期间,系统运行所有挂起的同步、作业和警报,并允许应用程序访问网络。

f703a4408f59018027c497afed848f77.png

二、Android电源管理框架

Android系统的电源管理框架分成五个部分:应用层,框架层,Native层,HAL层和内核层。电源管理架构图例如下:

503d455a8bf95b653e34932c7a74a832.png

应用接口层: PowerManager.java 负责向应用程序提供一系列接口,例如wakelock的申请与释放,进而让系统休眠或唤醒

框架层: PowerManagerService.java PowerManagerServic是android电源管理的核心服务,向上提供应用程序接口.向下通过hal层和kernel层来控制待机状态和系统硬件设备状态

HAL层: power.c 接收上层参数,通过写节点与kernel层通信

内核层: Kernel/Power 实现系统电源管理框架机制,为设备电源管理提供基础框架

三、WakeLock

Android中wakelock是一种锁的机制,用于阻止系统进入睡眠状态,只要有任意应用持有wakelock,那么系统就无法进入睡眠状态。

newWakeLock(int flags, String tag)

申请wakelock时有一个关键的参数flags,它有如下几种情况:

PARTIAL_WAKE_LOCK: Screen off, keyboard light off

SCREEN_DIM_WAKE_LOCK: Screen dim, keyboard light off

SCREEN_BRIGHT_WAKE_LOCK: Screen bright, keyboard light off

FULL_WAKE_LOCK: Screen bright, keyboard bright

上面4种是互斥的,即只能指定其中之一,但可以与下面两种flag不是互斥的:

ACQUIRE_CAUSES_WAKEUP:一旦有请求锁时强制打开Screen和keyboard light

ON_AFTER_RELEASE:在释放锁时reset activity timer

如果系统申请了PARTIAL_WAKE_LOCK,那么即使按power键,系统也不会进sleep,如music播放时.如果申请了其它的wakelocks,按power键,系统还是会进sleep

wakelock有加锁和解锁两种状态:

一种是永久性锁住,这种锁除非后续放开,否则不会解锁;

另一种是超时锁,这种锁会锁定系统一段时间后会自动解锁。

电源锁的两种类型:

(1)WAKE_LOCK_SUSPEND:阻止系统进入睡眠,属于永久性锁,超时锁为WAKE_LOCK_AUTO_EXPIRE

(2)WAKE_LOCK_IDLE:阻止持有该锁的系统进入idle状态

Android中使用两条链表分别保存处于active状态的suspend lock和idle lock和保存处于inactive状态的wakelock。

系统执行加放锁有两种机制,第一种是不计数锁,另一种是计数锁。可以通过PowerManager.WakeLock.setReferenceCounted(boolean value) 来指定,默认为计数机制。这两种机制的区别在于,前者无论 acquire() 了多少次,只要通过一次 release()即可直接解锁。而后者正真解锁是在( --count == 0 )的时候,同样当 (count == 0) 的时候才会去申请加锁,其他情况 isHeld 状态是不会改变的。所以 wakeLock 的计数机制并不是正真意义上的对每次请求进行申请/释放每一把锁,它只是对同一把锁被申请/释放的次数进行了统计后才去执行操作。

3.1wakelock在framework层

内核启动完成后,电源管理系统会在文件系统中建立两个节点:

/sys/power/wake_lock

/sys/power/wake_unlock

应用程序可以通过/sys/power/wake_lock申请一个WAKE_LOCK_SUSPEND 类型的锁,通过/sys/power/wake_unlock则可以释放一个锁。内核在进入suspend之前如果检测到某个锁没有释放,则会放弃本次的suspend过程,直到这个锁释放为止.Android持有电源锁后可以让持锁的进程持续执行,即使进入了睡眠模式。

如果应用崩掉或退出,系统会自动释放他们获取的所有电源锁;如果是在服务中获取的,当服务崩掉或注销时也会自动释放;

Framework层有关电源锁的内容是通过PowerManagerService类来实现,这个类是用来管理所有应用程序申请的wakelock,比如音视频播放器,camera等申请的wakelock都是通过这个类来管理的。如:

static final String PARTIAL_NAME = "PowerManagerService"

PARTIAL_NAME作为参数传递到底层去。

ADB 调试命令

echo lockname > /sys/power/wake_lock

加锁“lockname”

echo lockname > /sys/power/wake_unlock

解锁“lockname”

四、Earlysuspend和Lateresume

Early Suspend和Late Resume是Android在标准Linux的基础上增加的一项特性。当用户空间申请进入suspend时,会先进入early suspend状态.外设驱动程序可以注册early suspend回调函数,当进入early suspend时,内核会逐一地调用这些回调函数。例如在进入early suspend后,回调函数会通过屏幕驱动把屏幕和背光都关闭, 但此时系统依然在正常运行。进入early suspend状态以后,一旦所有wakelock被释放,系统马上会进入真正的suspend流程.

Android 4.4起,也就是引入ART的版本,摒弃了early suspend机制,改用了fb event通知机制,后续Android版本只有suspend、resume以及runtime suspend、runtime resume。

结语

本文讲述了Android电源管理模块的主要内容,旨在让读者对于Android电源状态及wakelock有一个初步的认识,方便以后深入介绍内核wakelock的实现和Android的待机唤醒流程.

引文:

[1]https://developer.android.google.cn/training/monitoring-device-state/doze-standby?hl=en

[2] 深入理解LINUX内核(第三版)(美)博韦,西斯特 著,陈莉君,冯锐,牛欣源 译

3b34c81fe51d912cb1cac0ff44bfbb5c.gif

长按关注内核工匠微信

Linux内核黑科技| 技术文章 | 精选教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/112062.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VsCode搭建C语言运行环境以及终端乱码问题解决

在VsCode中搭建C/C运行环境需要先安装以下插件 1、安装c/c插件 2、安装code runner插件 当然也可以安装一些其他的美化插件根据个人习惯,但是以上这两个是必装的。 安装好插件后来到插件主页点击卸载旁边的小齿轮选择扩展设置 找到扩展设置中的下图选项并打上勾即可…

前端小知识:控制台打印(console)- 模拟Java日志打印、表格形式打印美化输出对象、代码运行时间统计

文章目录6. 控制台打印(Console)模拟Java日志打印格式美化对象打印(表格形式打印输出)日志等级输出(让其在控制台显示时有颜色提示)代码运行时间统计打印输出6. 控制台打印(Console)…

LeetCode HOT 100 —— 560. 和为 K 的子数组

题目 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数 思路 首先,要明白本题不能使用双指针或者滑动窗口,因为双指针和滑动窗口使用的一个必要条件就是能一步一步迭代,确定窗口的收缩方…

Unity3D教程:2D游戏技能特效

在我们的2D图形游戏中不可缺少大量的光影、技能特效,像Diablo II中的魔法效果的实现,幸好我们拥有强大的CPU来为我们实现Alpha混合与色彩饱和混合,接下来让我们来讨论一下如何用这些方法来实现我们游戏中所需要的技能特效。 一、Alpha混合特效…

【ArcGIS Pro微课1000例】0023:ArcGIS Pro 3.0中打开GeoPackage数据库(.gpkg)

本文讲解ArcGIS Pro 3.0中打开GeoPackage数据库(.gpkg)的两种方法。 文章目录 一、QGIS创建GeoPackage二、ArcGIS Pro 3.0打开GeoPackage1. 直接加载2. 添加数据库一、QGIS创建GeoPackage 本文使用到的GeoPackage是在QGIS中创建并入库的,具体操作可以参考: 【QGIS入门实战…

Kakarot:部署在Starknet上的ZK-EVM type 3

1. 引言 sayajin-labs团队开源的: https://github.com/sayajin-labs/kakarot(ZK-EVM type 3 written in Cairo, leveraging STARK proof system.) Kakarot提供了相应的playground: https://playground.kakarot.org/?forkmerg…

aardio - libxl库,一个dll操作excel

经常用到excel操作,也有几个现成的库能实现我需要的功能,但用起来总是感觉不顺手。 于是便抽了两天时间,在aaz.libxl库的基础上,按照我的使用习惯进行了修改。 以后再也不用为操作excel发愁啦。 下载地址:http://che…

基于docker部署nexus并创建发布npm包

1. nenus部署 1.1 搜索镜像 [rootsurpass ~]# docker search nexus INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED docker.io docker.io/sonatype/nexus3 …

移动 IP(计算机网络-网络层)

目录 移动性对网络应用的影响 移动IP中数据报的转发过程 移动IP中数据报的转发过程 三角路由的低效性 解决三角路由的低效性 移动IP的标准 移动性对网络应用的影响 现在先考虑这样一种情况,一个用户拿着无线移动设备在一个Wi-Fi服务区内走动,并且边…

【Django】第一课 基于Django超市订单管理系统开发

概念 django服务器开发框架是一款基于Python编程语言用于web服务器开发的框架,采用的是MTV架构模式进行分层架构。 项目搭建 打开pycharm开发软件,打开开发软件的内置dos窗口操作命令行 在这里指定项目存放的磁盘路径,并使用创建django项…

UDP通信

目录 一.预备知识 1.1IP与MAC 1.2端口号 1.3TCP与UDP协议 2.4网络字节序 二.socket编程接口 2.1socket常见API 2.2sockaddr结构 3.UDP网络程序 3.1服务端 3.1.1服务端创建套接字 3.1.2绑定服务端 3.1.3recvfrom 3.2客户端 3.2.1客户端创建套接字 3.2.2客户端绑…

目标检测之Faster RCNN分析

基本流程 图像输入网络得到特征图使用RPN生成候选框,将候选框投影到特征图获得特征矩阵对特征矩阵使用ROI pooling得到特征图并展平,得到预测结果 重点解析 RPN在网络中的位置 在上图中,从feature map层来看,有两个指向上层的箭头…

善用数据框,让你的工作更严谨统一,让你的地图更优雅、更专业

前言:数据框,一个经常被忽略的东西,只有偶尔才被想起。善用数据框能更好的管理我们的投影,更能轻松的控制图层的范围,甚至利用裁剪数据框更能让我们的地图好看...什么是数据框 好吧,这个很基础,但是我还是要提一下,可能有的读者确实不知道,毕竟它的中文译名就很奇怪。…

get/post/put/delete请求头说明

目录 1.请求头说明 2.get 3.delete 4.post 5.put 6. 说明 7.Content-Type说明 1.请求头说明 前端发出的请求通过浏览器进行查看,可以发现分为四个部分。常规信息(General),请求头信息(Request Headers),响应头信息(Response Headers)…

[思维模式-12]:《如何系统思考》-8- 工具篇 - 因果回路图/系统循环图/系统控制图,系统思考的关键工具

目录 第1章 因果回路图概述 1.1 什么是因果回路图 1.2 反馈回路 第2章 因果图的组成 2.1 回路 2.2 变量 2.4 连接 > 不同变量之间的函数关系 2.5 增强回路 2.6 调节回路 2.7 时间延时 第3章 因果图的用途与应用 3.1 因果图的价值 3.2 因果图的用途 第4章 因果图…

分布式微服务技术栈-SpringCloud+RabbitMQ+Docker+Redis

微服务技术栈一、微服务 介绍了解1 架构结构案例与 springboot 兼容关系拆分案例拆分远程调用2 eureka注册中心3 Ribbon 负载均衡4 nacos 阿里注册中心一、微服务 介绍了解 分布式架构的一种 把服务进行 拆分 springcloud 解决了 服务拆分过程中的 治理问题 与单体应用 进行区…

云服务器ECS入门

云服务器ECS入门 一、什么是云服务器ECS 云服务器ECS (Elastic Compute Service) 是阿里云提供的性能卓越、稳定可靠、弹性扩展的laaS(Infrastructure as a Service) 级别云计算服务 云服务器ECS免去了您采购IT硬件的前期准备,让您像使用水、电、天然气等公共资源…

Linux 下 使用点阵在LCD上显示汉字,字符

文章目录前言一、显示字符1.获取点阵:2.描点(显示字符函数):3. 要打开LCD设备:4. 通过ioctl 获取Framebuffer参数:5. 通过mmap映射出Framebuffer的地址:6.清屏并显示字符:二、显示汉字1.区位码&…

WSL2的安装、应用

WSL2的安装、应用WSL安装、升级常用命令WSL导入导出其他 - 图形界面、虚拟化WSL安装、升级 win10系统上开启WSL参考如下,我先是安装了WSL1,之后又升级到WSL2的。关键是一些Win10上电配置,之后在windows应用商店下载ubuntu即可。 win10上lin…

又一家中国企业加入RISC-V,中国力推之下必将打破ARM的垄断

近日消息指腾讯已正式加入RISC-V,并且是以高级别的高级会员加入,显示出腾讯开发RISC-V架构芯片的决心,这显示出中国芯片行业正齐心协力发展RISC-V架构,将打破ARM的垄断。腾讯在芯片行业已取得一定的成绩,分别推出了AI推…