Android电源键亮灭屏流程
一、整体框架介绍
电源键亮灭屏流程从框架上分硬件层,驱动层,Java框架层和Natvie服务层;
整个流程分为两部分,一部分是电源按键事件传递流程,一部分是亮灭屏处理流程;
中间通过一个策略类来衔接,决定按键动作是做亮屏还是灭屏动作。
二、电源键传递流程
1. 内核空间电源键传递流程
各层的介绍如下:
设备驱动层:将底层的硬件输入转化为统一事件形式,向核心层传递;
核心层:为驱动层提供输入设备注册与操作接口,通知事件处理层对事件进行处理;
事件处理层:主要是和用户空间交互,提供设备节点来给用户空间访问;
用户空间: 从事件处理层获得事件,进行进一步的事件分发和业务处理。
电源键的处理流程是:
1)按键驱动初始化的时候首先通过request_irq进行中断的注册;
2)当电源键按下和抬起时候,发生中断,中断处理函数被执行,调用input接口input_report_key和input_sync来进行事件的上报;
3)事件通过核心层和事件层后,到达用户空间,这样用户空间的程序就可以通过/dev/input节点和getEvents获得按键事件。
2. 用户空间电源键传递流程
InputReader线程的loop里面,通过EventHub的getEvents函数获得按键事件,然后传递给processEventsLocked来处理。
processEventsLocked依次调用processEventsForDeviceLocked()->InputDevice::process()->KeyboardInputMapper::process()->processKey()函数。
processKey会调用listener的notifyKey,这个linstener是谁呢?
跟踪赋值流程可以找到,getListener获得的是在InputManager开始初始化时候生成的InputDispatch对象,所以按键传递给了InputDispatch的notifyKey。
InputDispatch::notifyKey对事件的处理,首先调用interceptKeyBeforeQueueing,让策略类在入队前能处理该事件。
interceptKeyBeforeQueueing经过InputManager和WindowManager的InputManagerCallback调用,最终执行到PhoneWindowManager的interceptKeyBeforeQueueing方法,具体做了如下动作:
1)将result去掉了ACTION_PASS_TO_USER标志位;
2)调用interceptPowerKeyDown和interceptPowerKeyUp分别处理电源键的按下和抬起,这两个处理函数我们在下一章的亮灭屏流程中详细介绍。
调用完interceptKeyBeforeQueueing之后,接着调enqueueInboundEventLocked将该事件入队。
InputReader线程将事件入队后,InputDispatch线程在looper处理里面,会将事件取出,然后调用dispatchKeyLocked进行事件的派发处理。
如果判断是KEYCODE_POWER,isValidGlobalKey会返回true, 接着PhoneWindowManager的interceptKeyBeforeDispatching则返回-1。
interceptKeyBeforeDispatching返回的-1赋值给InputDispatcher里面delay,判断小于0,则会将interceptKeyResult标志设置为INTERCEPT_KEY_RESULT_SKIP。
在dispatchKeyLocked函数里面会判断上面的interceptKeyResult标志,如果是INTERCEPT_KEY_RESULT_SKIP,则Power键会drop掉,不会传递给应用。
电源键传递流程总结一下,在入队前通过传递给策略类的interceptKeyBeforeQueueing来处理具体业务,而在派发流程里面则会忽略掉。
三、亮灭屏处理流程
1. 亮屏处理流程
亮屏的触发是电源键按下时候触发的,我们来看下interceptPowerKeyDown,判断interactive为灭屏状态,则调用wakeUpFromPowerKey唤醒系统。
wakeUpFromPowerKey调用到PowerManagerService的wakeUp函数。
PowerManagerService wakeUp进行权限检查后,调用到wakeUpInternal。
可以看到主要做了两件事,调用wakeUpNoUpdateLocked,如果返回true,则调用updatePowerStateLocked。
我们先来看下wakeUpNoUpdateLocked里面做了哪些动作,首先做了一些状态判断和变量赋值,然后执行:
1)setWakefulnessLocked,设置wakefulness为WAKEFULNESS_AWAKE唤醒状态,并发送亮屏广播;
2)mNotifier.onWakeUp,通知BatteryStatsService、AppService系统服务唤醒状态变化;
3)userActivityNoUpdateLocked更新用户活动时间,重置超时灭屏时间。
接下来我们看updatePowerStateLocked,这个里面主要是在updateDisplayPowerStateLocked里面处理亮屏的关键动作:
1)updateDisplayPowerStateLocked调用requestPowerState设置mPendingRequestLocked变量;
2)调用sendUpdatePowerStateLocked发送MSG_UPDATE_POWER_STATE消息,MSG_UPDATE_POWER_STATE的消息处理里面调用updatePowerState;
3)updatePowerState调用animateScreenStateChange;
4)根据状态判断后调用setScreenState(Display.STATE_ON)->
DisplayPowerController::setScreenState()->DisplayPowerState::setScreenState(),通过scheduleScreenUpdate启动一个mScreenUpdateRunnable;
5)mScreenUpdateRunnable里面调用mPhotonicModulator.setState(mScreenState, brightnessState),
赋值mPendingBacklight变量后通知PhotonicModulator线程去处理,调用到mBlanker.requestDisplayState;
6)DisplayManagerService在initPowerManagement初始化的时候会注册requestDisplayState的处理,具体处理步骤是:requestDisplayState->requestGlobalDisplayStateInternal->applyGlobalDisplayStateLocked->updateDisplayStateLocked;
7)LocalDisplayAdapter::requestDisplayStateLocked调用背光的设置函数setDisplayBrightness。
至此SurfaceControl再通过native方法通过binder通信通知surfaceflinger设置背光。
SurfaceFlinger通过调用Hal层的实现,操作内核背光节点,从而完成背光的设置。
2. 灭屏处理流程
灭屏是按下电源键后抬起的时候触发,流程这块我们来看interceptPowerKeyUp,做了一些长按和多次点击判断后,正常短按点击会跑到powerPress函数。
powerPress进一步调用goToSleepFromPowerButton函数。
进而调用到PowerManagerService的goToSleep,进行权限检查后调用goToSleepInternal。
这里可以看到调用了goToSleepNoUpdateLocked和updatePowerStateLocked,也就是在goToSleepNoUpdateLocked里面设置灭屏状态。
1)在goToSleepNoUpdateLocked()中完成发送了将要休眠的通知;
2) 修改了Wakefulness,将其置成WAKEFULNESS_DOZING,将mDirty置位DIRTY_WAKEFULNESS。
更多的实际动作在updatePowerStateLocked()中完成,背光变化流程和3.1章节介绍的亮屏流程是一样的。
亮灭屏流程总结一下,亮屏流程通过wakeUpNoUpdateLocked设置唤醒状态,灭屏流程通过goToSleepNoUpdateLocked设置灭屏状态,最终都是调用updatePowerStateLocked来完成最终背光变化动作。
参考链接:
[1] https://blog.csdn.net/qq_35865125/article/details/80637809
[2] https://www.jianshu.com/p/961207f442f9
长按关注
内核工匠微信
Linux 内核黑科技 | 技术文章 | 精选教程
Android电源键亮灭屏流程相关推荐
- qcom平台 LCD亮灭屏流程及LCD知识点总结
一.LK中亮屏流程 1.gcdb_display_init(),进行display初始化的起始地方: 2.oem_panel_select(),在这里去选择哪一款屏,也可以在这里添加新一款屏: 3.d ...
- Android Keyguard 亮灭屏流程分析
文章目录 概述 Keyguard 关键文件 Power 灭屏 超时灭屏 Power 亮屏 FAQ 亮屏慢 概述 Keyguard 锁屏流程: Keyguard 加载时机:一个是开机的时候:另一个是灭屏 ...
- 常见的亮灭屏流程分析
一 . 亮屏主要关键log 驱动按键时间 ??-?? ??:??:??.??? <3>[14082.058160] (0)[70:pmic_thread]kpd: Power Key g ...
- android 亮灭屏流程
1. frameworks\base\core\java\android\hardware\display\DisplayManagerInternal.java 内部服务 frameworks\ba ...
- Android 系统(40)--Android7.0 PowerManagerService亮灭屏分析(一)
Android7.0 PowerManagerService亮灭屏分析(一) 可以导致手机亮灭屏的因素有多种,而在本文中主要讲解按power键亮灭屏过程以及来电亮屏.在亮灭屏过程power中主要的实现 ...
- Android 系统(42)---Android7.0 PowerManagerService亮灭屏分析(三)
Android7.0 PowerManagerService亮灭屏分析(三) 在前面两部分已经对绘制windows与设置设备状态进行了详细讲解. 之后接着就该对亮度值进行设置, 实现亮屏动作了. 在D ...
- Android7.0 PowerManagerService亮灭屏分析(一)
绪论 可以导致手机亮灭屏的因素有多种,而在本文中主要讲解按power键亮灭屏过程以及来电亮屏.在亮灭屏过程power中主要的实现类与功能如下所述: PowerManagerService.java:以 ...
- Android7.0 PowerManagerService亮灭屏分析(三)
在前面两部分已经对绘制windows与设置设备状态进行了详细讲解. 之后接着就该对亮度值进行设置, 实现亮屏动作了. 在DisplayPowerController中的animateScreenBri ...
- Android 按电源键亮屏/息屏流程分析
上一篇介绍了Android 电源键事件流程分析,其中分析了,在按电源键,长按的时候,弹出系统菜单,以及点击其中的关机按键,都执行了哪些操作.这一篇,作为上一篇的补充,主要分析一下,Android按键亮 ...
- Android 8.0 手机亮灭屏
本文主要跟踪分析通过按松power键来唤醒,熄灭屏幕的逻辑.下面是一些相关类的介绍 PowerManagerService.java:简称PMS,负责Andorid系统中电源管理方面的工作.作为系统核 ...
最新文章
- 你知道数据中心宕机的真正成本吗?
- 单片机18b20c语言程序,AVR单片机控制DS18B20的示例C程序
- react源码分析-setState分析
- 高退出低留存:六年百万数据透析,想颠覆传统教育的MOOC怎么了?
- Altium Designer -- PCB设置板框
- 【职场】职场上给的期权是什么,重要吗?
- oracle open for using的用法,oracle OPEN FOR [USING] 语句
- C++(纯)虚函数重写时访问权限更改问题
- C语言typedef关键字—伟大的缝纫师
- 刚刚!第七次人口普查出炉!男性比女性多3490万,老龄化进一步加深
- ktv登陆功能的实现 1216
- SET化消息中间件架构实现
- linux删除文件文件夹
- silverlight 碰撞检测
- 智能车竞赛技术报告 | 智能车视觉 - 西北工业大学 - 赤霄2021
- 【矩阵论 图论】期末考试复习思维导图
- QT设计风速仪上位机实例(串口读写数据处理数据下载)
- 解决WIN10本地账号绑定微软账号后无法解绑的方法
- androidのBack返回键,home键,menu键监听使用
- 英:英语面试常用口语900句
热门文章
- 微信小程序,短信验证码登录,设置密码,密码强度校验
- 【SpringBoot+Vue】前后端分离项目之图片上传与下载
- 豆瓣9分+纪录片,每一部都美到窒息......
- 修改linux域名解析失败,kali 更新域名解析失败问题解决办法
- 基于SSM+Layui的逆风医疗管理系统
- RxJava2.0_1:基础学习和理解
- 汤姆猫代码python_IOS 汤姆猫核心代码
- 蓝瘦香菇!美国帅小伙作死尝试无人机剪头发
- 为什么入侵地球的总是火星人,是别的星球不够努力吗?
- 普适计算-2014/03/28