android系统按键从linux到java流程
android系统按键从linux到java流程
概述:
android系统的键值转换,从linux到java共经历3个层次,分别是:
1 linux系统层,原始ir键值读取,转变为linux层键值 2 framework层,linux层键值转换为android键值 3 framework层,android键值上报java层 关系图: InputManager InputReaderThread InputDispatcherThreagetevents() mapkey() framework层: linux层键值转换为android键值 interceptKeyBeforeQueueing() interceptKeyBeforeDispatch ing() linux层: 转变为linux层键值 dev/input 原始ir键值读取,dev/vinput 最终输出:framework层: phonewindowmanger.java framework层: android键值上报java层
剩余疑问:dev/vinput和dev/input之间到底怎么关联的
间造成数据异常;二者由系统负责同步。 后续查到相关资料再补充.
目前没查到这二者是怎么关联的,但是从用户组可以看出,vinput应该是input的输入。 猜测:这二者之间类似一个软连接处理,避免键值读写都在同一个文件,在不同进程之
1 原始ir键值读取,转变为linux层键值 核心输入: 系统启动android_ir_user后台进程 核心输出: 虚拟设备dev/vinput,写入linux键值
1.1 流程图
key.xml:定义原始硬件码值和对应linux层通用键名: < key value =\name=\UTE\> linux_key.h: 定义linux层通用键名和linux层键值的对应关系 {\13} \桥梁 key_pars.c:提供 get_keycode接口,解析key.xml,结合linux_key.h,建立原始码值和linux层键值的映射数组 调用get_keycode 输出dev/vinput: 读取原始码值,根据keyarry转换为linux层键值,通过ReportKeyEvent写入虚拟设备dev/vinput设备,其他进程再从这读取linux键值 系统启动android_ir_user后台进程,执行ir_user.cpp的main入口 keyarry键值全局数组 原始键读取线程ir_sample_thread keyarry:桥梁
1.2转换流程详细说明:
1.2.1/device/hisilicon/bigfish/system/ir_user/key_pars/key.xml: 该文件编译后输出到/etc目录下。
定义原始硬件码值和对应linux层通用键名:
< key value=\
1.2.2/device/hisilicon/bigfish/system/ir_user/key_pars/linux_key.h: 定义linux层通用键名和linux层键值的对应关系: {\
1.2.3/device/hisilicon/bigfish/system/ir_user/key_pars/ key_pars.c: 提供接口get_keycode解析xml建立原始码值和linux层键值的映射数组 get_keycode(_key_arry *keyarry, int keyarry_num)解析: a:调用readXml读取/etc/ key.xml,返回xml根节点:
key.xml中
b:调用Pars_Key解析每个节点下的所有按键:
解析节点下的所有children节点,通过value属性获取xml定义的原始键值,通过name属性获取xml定义的键名字符串,再调用find_linux_key_code查询这个字符串对应的linux层键值。
把这个映射关系存储到:
keyarry->hi_keycode[keynum].ir_keycode = ir_keycode; keyarry->hi_keycode[keynum].linux_keycode = linux_keycode;
c: find_linux_key_code函数遍历在linux_key.h定义的Linux_KeyCode_Ary数组,找到参数str(即键名字符串)对应的linux层键值。
1.2.4/device/hisilicon/bigfish/system/ir_user/ir_user.cpp: 1)编译为后台进程android_ir_user独立运行;
2)进程启动,执行main入口函数,调用get_keycode完成key.xml存储原始码值和linux层键值的映射关系到数组keyarry;
3)建立ir_sample_thread线程读取原始码值,根据keyarry转换为linux层键值,通过ReportKeyEvent写入dev/vinput设备,其他进程可以读取键值 1.3总结
出差拷机,如果不想其他厂家操作我们的盒子,只需要离开的时候删除/system/bin下面的android_ir_user这个bin文件即可。
113 },
结构linux_keycode_ary类型的数组Linux_KeyCode_Ary[512].
2 linux层键值转换为android键值
核心输入: /dev/input, 输入linux键值
核心输出: 1)getEvents(),输出RawEvent* buffer,存储linux层键值; 2)mapKey(),将linux层键值转换为android键值
2.1流程图
getEvents():,输出RawEvent* buffer mapKey(): 将linux层键值转换为android键值
Vendor_0001_Product _0001.kl: 定义linux键值和对应的键名字符串 key 113 MUTE KeycodeLabels.h: 定义键名字符串和android的java层键值对应关系结构数组KEYCODES: { \Keyboard.cpp: 定位linux到android键第一转换映射文件为Vendor_0001_Product_0001.kl KeyLayoutMap.cpp: 1)解析Vendor_0001_Product_0001.kl,并结合KeycodeLabels.h最终建立里建立linux层键值到android键值 的映射集合map 2)提供mapKey EventHub.cpp: 1 getEvents() 2 mapKey() 1)建立linux层键值到android键值 2)读取/dev/input设备上的 的映射集合map 键值到RawEvent* buffer 2.2详细说明
2.2.1 /device/hisilicon/bigfish/prebuilts/Vendor_0001_Product_0001.kl: 定义linux键值和对应的键名字符串 key 113 MUTE
2.2.2 /frameworks/native/include/input/KeycodeLabels.h
定义键名字符串和android的java层键值对应关系结构数组KEYCODES: { \
2.2.3\\frameworks\\native\\libs\\input\\ Keyboard.cpp
提供函数loadKeyLayout和getPath,定位linux到android键第一转换映射文件为Vendor_0001_Product_0001.kl:
提供函数getKeyCodeByLabel,从KeycodeLabels.h的KEYCODES数组中,查询返回android的java键值。
2.2.4\\frameworks\\native\\libs\\input\\ KeyLayoutMap.cpp
提供函数load和parse等解析Vendor_0001_Product_0001.kl,并调用
Keyboard.cpp的getKeyCodeByLabel,通过“linux键值---键名字符串---android的java层键值”的直接建立“linux键值--- android的java层键值”map集合; 提供函数mapKey基于此集合供上层转换linux键值为android的java键值
2.2.5 \\frameworks\\base\\services\\input\\EventHub.cpp
1 提供getEvents,完成两个事:
1):建立linux键值--- android的java层键值”map集合。 2):扫描linux键值,存储到参数RawEvent* buffer。
2 提供mapKey,调用KeyLayoutMap.cpp的mapKey函数,完成转换linux
键值为android的java键值。
2.2.6关于建立linux键值--- android的java层键值”map集合,代码流程: 1)\\frameworks\\base\\services\\input\\EventHub.cpp a)getEvents()-> scanDevicesLocked():
b)scanDevicesLocked-> scanDirLocked(): static const char *DEVIC …… 此处隐藏:2271字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [基础教育]2016-2022年中国钢芯铝绞线市场现状调
- [基础教育]语文部编版初一语文下册练习题 句式变
- [基础教育]南京继续教育参考答案--深入学习贯彻习
- [基础教育]国旗下讲话稿——珍惜时间好读书
- [基础教育]北师大版六年级数学下册圆锥的体积教学
- [基础教育]人教版-音乐-四年级下册-四年级下册音
- [基础教育]乔布斯2019年斯坦福大学毕业典礼致辞.d
- [基础教育]2015年加油站安全知识竞赛试题及答案
- [基础教育]2020年教师年度考核个人工作总结
- [基础教育]2019年中考历史试题-2019年大庆市初中
- [基础教育]初三仁爱英语第一轮总复习教案
- [基础教育]SG-A094电气配管安装工程隐蔽验收记录
- [基础教育]冀教版小学数学三年级下册第六单元教材
- [基础教育]青岛版(五制)小学科学二年级下册16《制
- [基础教育]2018-2019年初中科学初一中考真卷测试
- [基础教育]幼儿园大班期末简短评语精选
- [基础教育]2018云南临沧公务员考试申论技巧:这样
- [基础教育]学校食堂经营管理方案
- [基础教育]新中国砥砺奋进的七十年原文
- [基础教育]真空泵的选型及常用计算公式
- 高职田径课程教学现状与对策
- 全髋关节置换术在老年股骨颈骨折患者中
- 青人社厅函〔2016〕576号(附件)工资
- cp101-07砂子检验作业指导书 - secret
- 微观经济学 第八章 博弈论 习题
- 2014高考真题(词语运用)汇编及答案
- 2018年人教版七年级语文下册《第三单元
- 苏教版数学四年级上册第一单元试题 - M
- 四川大学新闻与传播考研2000-2010年真
- 浙江万里学院英语专业四年制本科教学计
- 最新2018马年事业祝福语-范文word版(2
- 最全模具行业术语英文翻译
- 皮亚杰的发展心理学理论
- 64篇高考情景式默写 练习题及答案
- 仿写(学生稿)
- 《SQL Server数据库技术》试卷A
- 第七章作业答案
- 江苏省赣榆县海头高级中学高中语文必修
- 浙江省2001年10月自考正常人体解剖学答
- 2012英语重点短语




