android系统按键从linux到java流程
目录
概述: ....................................................................................................................................................... 2 核心文件关系图: ............................................................................................................................... 3 1 原始ir键值读取,转变为linux层键值 ......................................................................................... 4
1.1 流程图 .................................................................................................................................... 4 1.2转换流程详细说明: ............................................................................................................ 5 1.3总结 ......................................................................................................................................... 5 2 linux层键值转换为android键值 ................................................................................................ 6
2.1流程图 ..................................................................................................................................... 6 2.2详细说明 ................................................................................................................................. 7 3 Android键值上报java层 ........................................................................................................... 10
3.1流程图 ................................................................................................................................... 10 3.2详细说明 ............................................................................................................................... 10 总结: .................................................................................................................................................. 22
概述:
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的输入。 猜测:这二者之间类似一个软连接处理,避免键值读写都在同一个文件,在不同进程之
核心文件关系图:
/device/hisilicon/bigfish/system/ir_user/key_pars/key.xml: 定义原始键值和linux键名之间的映射关系: key value=\/device/hisilicon/bigfish/system/ir_user/key_pars/linux_key.h: 定义linux键名和键值之间的映射关系: \ 113 /device/hisilicon/bigfish/prebuilts/Vendor_0001_Product_0001.kl: 定义linux键值和android层过渡键名之间的映射关系: key 113 MUTE /frameworks/native/include/input/KeycodeLabels.h: 定义android层过渡键名和android层键值之间的映射关系(通过JNI上报java): \/frameworks/base/core/java/android/view/KeyEvent.java: 接收andriod层键值,完成按键相关处理: getKeyCode ;public static final int KEYCODE_MUTE = 91; 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层键值的对应关系: {\
113 },
结构linux_keycode_ary类型的数组Linux_KeyCode_Ary[512].
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文件即可。