InputManagerService启动-Android12
InputReader线程获取输入事件-Android12
InputDispatcher线程分发事件-Android12
InputChannel通道建立-Android12
InputChannel发送Input给App-Android12
一般手机侧边有三个实体按键power开关机键、音量上键、音量下键:
- KEYCODE_POWER = 26
对应scancode码- KEYCODE_VOLUME_UP = 24
对应scancode码- KEYCODE_VOLUME_DOWN = 25
对应scancode码
1.1 实体按键添加
IMS:EventHub 设备添加和InputDevice转化 手机实体按键其实也是添加设备。其中关键方法、
1.2 从dumpsys input信息查看
下面是cepheus_input.txt(小米9机器),查看下面两个dump()信息:
frameworks/native/services/inputflinger/reader/InputReader.cpp中InputReader::dump()
frameworks/native/services/inputflinger/reader/EventHub.cpp中EventHub::dump()
frameworks/native/services/inputflinger/reader/InputDevice.cpp中InputDevice::dump()
frameworks/native/services/inputflinger/reader/mapper/KeyboardInputMapper.cpp中KeyboardInputMapper::dump()
设备表示Classes码
添加的设备节点
按键布局kl文件用来完成映射过程
kcm文件转化为显示在文本框的字符
与Classes码对应的Sources码
添加对应InputMapper文件:frameworks/native/services/inputflinger/reader/mapper/KeyboardInputMapper.cpp
具体功能实现位置在 IMS:Input事件可拦截位置
- 添加队列之前拦截
- 发送之前拦截
frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java#interceptKeyBeforeQueueing
2.1 没有启动完成KeyEvents不做任何事情,其中KEYCODE_POWER例外
如果我们还没有启动完成,KeyEvents不做任何事情。
例外:唤醒和电源键KeyEvents事件被转发到PowerManager,以允许它在引导期间从静态模式唤醒。
2.2 双击power键启动相机
Android S上 新增改变,注释解释为了解决多屏显示的场景下出现错误的状态
- 处理启动相机,最终调用
- 中计算判断
- 注册到StatusBarManagerService
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java- 功能开关判断
frameworks/base/services/core/java/com/android/server/GestureLauncherService.java
2.3 五次点击power键启动SOS紧急呼叫
在 发现 中有,也是通过GestureLauncherServiceStatusBarManagerService服务调用到StatusBar.java中onEmergencyActionLaunchGestureDetected(),不同的是需要5次()点击power键
- 功能开关
- 有个疑问,不知道为什么这样设计,这里是优先处理
2.4 power长按功能 ,如唤起语音助手、关机、重启等弹框
回到 power键处理
- PhoneWindowManager.java初始化是在initSingleKeyGestureRules中添加new PowerKeyRule(powerKeyGestures)
- 长按调用PowerKeyRule中,powerLongPress(eventTime)处理长按功能:
- 唤醒助手界面launchAssistAction()
- 唤醒语音助手launchVoiceAssist
- 弹出关机、重启、飞行模式等选项对话框showGlobalActions()
- 关闭所有窗口,执行
- config_LongPressOnPowerBehavior配置值
frameworks/base/services/core/java/com/android/server/policy/SingleKeyGestureDetector.java
frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
2.5 power键亮灭屏
接着查看power键点击亮灭屏,按下interceptKeyDown 抬起interceptKeyUp;关注抬起后操作未触发长按继续处理,可能是多次点击power键延时处理,看到onPress()onMultiPress()最终都是调用,这里没有处理通知亮屏逻辑。
- 延时时间,默认时间是
- 查看时,mShortPressOnPowerBehavior基本有两种行为动作
- 灭屏sleepDefaultDisplayFromPowerButton()
- 回到HOME桌面
- config_shortPressOnPowerBehavior配置值
frameworks/base/services/core/java/com/android/server/policy/SingleKeyGestureDetector.java
frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
2.5.1 power键亮屏
Android S上 新增改变处理等事件,优先处理,继续查看代码,发现PhoneWindowManager.java中有power键处理,亮屏处理就是在interceptPowerKeyDown()中:
- 持有power的WakeLock;
- wakeUp亮屏
2.6 音量上下键调节音量KEYCODE_VOLUME_DOWNKEYCODE_VOLUME_UP
这个一般就是耳机上的按键,主要控制音乐暂停播放等。这里主要查看KEYCODE_VOLUME_DOWNKEYCODE_VOLUME_UP按键:
- 通知到SystemUI中,这里看到只有按下DOWN时通知,没有看到抬起UP时通知
- 调用MediaSessionService.java#dispatchVolumeKeyEvent()调节音量
在此查看handleKeyGesture方法,优先处理;下面具体查看组合按键规则添加
3.1 POWER+VOLUME_DOWN截图功能
添加,截图
3.2 VOLUME_DOWN+VOLUME_UP辅助功能快捷方式
添加,执行激活辅助功能
3.3 POWER+VOLUME_UP 静音
添加,执行执行中区分两种行为:
- 执行 设置 静音模式RINGER_MODE_SILENT
- 执行 弹出关机、重启、飞行模式等选项对话框;power长按功能中也有行为实现该功能