Android 按键流程
一、驱动层流程
主要流程涉及以下文件
kernel/msm-4.19/drivers/input/keyboard/gpio_keys.c
kernel/msm-4.19/drivers/input/input.c
kernel/msm-4.19/drivers/input/evdev.c
kernel/msm-4.19/drivers/input/input-compat.c
有按键动作时,根据 dtsi 中配置 code 上报事件。在 gpio_keys.c 中进行处理,最终在 gpio_keys_gpio_report_event 函数中调用 input.c 上报事件。大概流程分为两步。
第一步:获取event事件保存到队列中
input.c:input_event -> input_handle_event -> input_pass_values -> input_to_handler(此函数中调用 handler->events ,handler 定义在 evdev.c 中,events 对应函数 evdev_events)
evdev.c:evdev_events -> evdev_pass_values -> __pass_event (将event事件添加到缓存队列 client->buffer)
第二步:通过循环读取队列中event事件保存到用户内存
evdev.c:evdev_read -> input_event_to_user
input-compat.c:input_event_to_user -> copy_to_user
二、上层流程
主要流程涉及以下文件
frameworks/native/services/inputflinger/reader/EventHub.cpp
frameworks/native/services/inputflinger/reader/InputReader.cpp
frameworks/native/services/inputflinger/reader/InputDevice.cpp
frameworks/native/services/inputflinger/reader/mapper/KeyboardInputMapper.cpp
frameworks/native/services/inputflinger/dispatcher/InputDispatcher.cpp
frameworks/native/libs/input/KeyLayoutMap.cpp
frameworks/native/libs/input/Keyboard.cpp
上层获取按键事件流程大致如下:
InputReader.cpp:loopOnce -> processEventsLocked -> processEventsForDeviceLocked (调用 device->process)
InputDevice.cpp:process (调用 mapper.process)
KeyboardInputMapper.cpp:process -> processKey(调用 getListener()->notifyKey)
InputDispatcher.cpp:notifyKey(调用 mPolicy->interceptKeyBeforeQueueing 传递到java层)
三、键值转换
按键键值有两个,底层驱动键值和上层应用使用键值,这个对应关系定义在 kl 文件中,kl 文件可以有多个,例如 Generic.kl fts_ts.kl 等,默认系统中路径在 /system/usr/keylayout/ 目录下。
#kl 文件内容格式
#key 驱动键值 上层键值
key 113 VOLUME_MUTE
key 114 VOLUME_DOWN
key 115 VOLUME_UP
key 116 POWER
系统开机时,会根据 frameworks/native/libs/input/InputDevice.cpp 规则加载 kl 文件。加载 kl 文件函数在 KeyLayoutMap.cpp 中,将所有文件按照 kl 名称类型加到 KeyedVector<int32_t, Key> 中缓存。
KeyLayoutMap.cpp:load -> parse -> parseKey
//parseKey 代码段
KeyedVector<int32_t, Key>& map = mapUsage ? mMap->mKeysByUsageCode : mMap->mKeysByScanCode;... ...#if DEBUG_PARSERALOGD("Parsed key %s: code=%d, keyCode=%d, flags=0x%08x.",mapUsage ? "usage" : "scan code", code, keyCode, flags);
#endifKey key;key.keyCode = keyCode;key.flags = flags;map.add(code, key);return NO_ERROR;
parseKey 函数 KeyedVector<int32_t, Key> map 中按照 code-key 格式保存,code就是 kl 中驱动键值,key里面保存了 kl 中上层键值。当驱动按键事件上来后,根据驱动键值查询上层键,整合再上传到java层供应用使用。查询动作在 KeyboardInputMapper.cpp processKey 函数中。函数调用关系如下:
[KeyboardInputMapper.cpp]processKey(getDeviceContext().mapKey) -> [InputDevice.h]mapKey -> [EventHub.cpp]mapKey -> [KeyLayoutMap.cpp]mapKey -> getKey
const KeyLayoutMap::Key* KeyLayoutMap::getKey(int32_t scanCode, int32_t usageCode) const {if (usageCode) {ssize_t index = mKeysByUsageCode.indexOfKey(usageCode);if (index >= 0) {return &mKeysByUsageCode.valueAt(index);}}if (scanCode) {ssize_t index = mKeysByScanCode.indexOfKey(scanCode);if (index >= 0) {return &mKeysByScanCode.valueAt(index);}}return nullptr;
}
这里面的 mKeysByScanCode 就是上面解析 kl 保存的键值map,通过 scanCode(驱动键值)获取下标,通过下标获取 Key(上面说过的,保存上层键值的)。最后 KeyboardInputMapper.cpp processKey 后续流程把包含 Key 上报到 java 层使用。
相关文章:
Android 按键流程
一、驱动层流程 主要流程涉及以下文件 kernel/msm-4.19/drivers/input/keyboard/gpio_keys.c kernel/msm-4.19/drivers/input/input.c kernel/msm-4.19/drivers/input/evdev.c kernel/msm-4.19/drivers/input/input-compat.c 有按键动作时,根据 dtsi 中配置 c…...

C语言——运算符
C用运算符表示算术运算。 C没有指数运算符,不过,C的标准数学库提供了一个pow()函数用于指数运算。 基本运算符 赋值运算符: 变量名变量值 从右到左 左值和变量名的区别: 变量名是一个标识符的名称,左值是一个可变…...

MySQL数据库入门到精通8--进阶篇( MySQL管理)
7. MySQL管理 7.1 系统数据库 Mysql数据库安装完成后,自带了一下四个数据库,具体作用如下: 7.2 常用工具 7.2.1 mysql 该mysql不是指mysql服务,而是指mysql的客户端工具。 语法 : mysql [options] [database] 选…...

硬件基本功--MOS管
一、上下拉电阻Rgs的作用 Rgs:经验值,一般取10K左右。 1. 上电时给MOS管的栅极一个确定的电平,防止上电时GPIO为高阻态时,MOS管的栅极电平不确定,从而受到干扰。 2. 断电时,如果MOS管是导通的状态ÿ…...

xdebug3开启profile和trace
【xdebug开启profiler】 https://xdebug.org/docs/profiler http://www.xdebug.org.cn/docs/profiler 1、php.ini添加下面配置然后重启php容器: xdebug.modeprofile ;这个目录保存profile和trace文件 xdebug.output_dir /var/tmp/xdebugPHP日志提示报错:…...

EfficientFormer:高效低延迟的Vision Transformers
我们都知道Transformers相对于CNN的架构效率并不高,这导致在一些边缘设备进行推理时延迟会很高,所以这次介绍的论文EfficientFormer号称在准确率不降低的同时可以达到MobileNet的推理速度。 Transformers能否在获得高性能的同时,跑得和Mobile…...

【咕咕送书第二期】| 计算机网络对于考研的重要性?
🎬 鸽芷咕:个人主页 🔥 个人专栏:《粉丝福利》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活! 文章目录 📋 前言什么是计算机网络?01 为什么计算机专业要学计算机网络02 计算机网络对考研的重要性 …...
【力扣】58. 最后一个单词的长度
题目描述 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1: 输入:s “Hello World” 输出:…...

Java编程的精髓:深入理解JVM和性能优化
文章目录 Java虚拟机(JVM)的核心概念1. 类加载器(Class Loader)2. 内存区域3. 垃圾回收(Garbage Collection)4. 类型转换和多态 JVM性能调优1. JVM参数调整2. 内存管理3. 多线程优化4. 使用性能分析工具5. …...

易云维®智慧工厂数字化管理平台助推工业制造企业数字化转型新动能
近年来,我国正在积极推进工业制造企业数字化转型,工业制造企业数字化转型迎来了密集的利好政策,近期,国家工信部又出台系列政策,实施工业制造企业数字化促进工程,推动工业制造企业更快更好地拥抱数字经济。…...
0.基本概念——数据结构学习
数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。 数据:描述客观事物的符号,是计算机可以操作的对象,是能被计算机识别,并输出给计算机处理的符号集合。数据元素…...

Redis可视化工具-Another Redis Desktop Manager 安装
Another Redis DeskTop Manager 是 Redis 可视化管理工具,体积小,完全免费。最重要的是稳定,而且操作简单、方便。 目录 一、下载安装 下载 安装 二、简单使用 连接 新增key 三、springboot整合redis 前期准备 一、下载安装 下载 下载…...

ETLCloud工具让美团数据管理更简单
美团为第三方开发者和商家提供了一系列开放的API接口和工具,使其可以与美团的业务进行对接和集成,从而获得更多的业务机会和增长空间。 通过美团开放平台,第三方开发者和商家可以实现以下功能: 开放接口:美团开放平台…...

ctfshow 命令执行 (29-39)
学习参考的 https://www.cnblogs.com/NPFS/p/13279815.html 说的很全面 web29 命令执行,需要严格的过滤 源码 error_reporting(0); if(isset($_GET[c])){$c $_GET[c];if(!preg_match("/flag/i", $c)){eval($c);}}else{highlight_file(__FILE__); } …...

如何玩转CSDN AI工具集
前言 人工智能生成内容(AIGC)是当下最具有前景的技术领域之一。AI能够以惊人的速度和准确度生成各种类型的内容,完成文章翻译、代码生成、AI对话、插图创作等工作,带来了许多令人兴奋的机遇。 本文将介绍CSDN AI工具集的基本使用…...

软件测试/测试开发丨利用人工智能ChatGPT自动生成PPT
点此获取更多相关资料 简介 PPT 已经渗透到我们的日常工作中,无论是工作汇报、商务报告、学术演讲、培训材料都常常要求编写一个正式的 PPT,协助完成一次汇报或一次演讲。PPT相比于传统文本的就是有布局、图片、动画效果等,可以给到观众更好…...
Vue 正计时器组件
工作中遇到了一个时间正计时的功能。 另外涉及到有Vue父组件调用子组件中的data和method,作为记录。 下面贴代码~ HTML部分 <template><div class"timer"><div ref"startTimer">00:00:00</div></div> </template>JS…...

神仙打架!谷歌和OpenAI竞相推出多模式AI
原创 | 文 BFT机器人 随着秋季的到来,科技界正在展开另一场季节性活动——科技巨头谷歌和OpenAI正在竞相发布下一代多模态大语言模型,这些高级模型能够解释图像和文本,使他们能够执行诸如从草图生成网站代码或以文本形式描述视觉图表等任务。…...
MySQL 字符集
文章目录 1.简介2.支持的字符集3.字符集级别4.数据库字符集5.数据表字符集6.表字段字符集7.字符串常量字符集8.客户端字符集参考文献 1.简介 MySQL 支持多种字符集,使您能够使用各种字符集存储数据,并根据给定排序规则执行比较。 MySQL 服务器默认字符…...

java生成PDF的Util
java使用itext生成pdf-CSDN博客 接上文 支持绘制表格 支持表格中的文本 字体加粗、字体上色、单元格背景上色, 支持拼接文本 支持单行文本 多种背景颜色、字体上色 支持自定义水印 废话不说先上效果图 工具类代码 package com.zxw.文件.PDF.util;import com.…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...