android系统按键从linux到java流程
### Android系统按键从Linux到Java流程详解 #### 概述 Android系统对于遥控器按键的处理,实际上涉及到了从硬件层、操作系统内核层到应用框架层等多个层面的交互与转换。这一过程不仅体现了Android系统架构的设计思想,还反映了其在用户输入管理方面的灵活性与高效性。接下来,我们将详细探讨这一流程中的关键步骤。 #### 1. Linux系统层:原始IR键值读取,转变为Linux层键值 **核心输入**:系统启动`android_ir_user`后台进程 **核心输出**:虚拟设备`/dev/vinput`,写入Linux键值 ##### 1.1 转换流程详细说明 **1.2.1** 文件路径:`/device/hisilicon/bigfish/system/ir_user/key_pars/key.xml` 该文件在编译后会被输出到`/etc`目录下。在这个XML文件中,定义了原始硬件码值与对应的Linux层通用键名之间的映射关系,例如: ```xml <key value="0x639c4db2" name="KEY_MUTE"/> ``` 这里,`0x639c4db2`表示的是原始硬件码值,而`KEY_MUTE`则是对应的Linux层通用键名。 **1.2.2** 文件路径:`/device/hisilicon/bigfish/system/ir_user/key_pars/linux_key.h` 此文件定义了Linux层通用键名与Linux层键值之间的对应关系。例如: ```cpp {"KEY_MUTE", 113}, ``` 这里定义了一个名为`Linux_KeyCode_Ary`的数组,包含了512个元素,用于存储键名与键值的映射。 **1.2.3** 文件路径:`/device/hisilicon/bigfish/system/ir_user/key_pars/key_pars.c` 提供了接口`get_keycode`用于解析XML文件,并建立原始码值与Linux层键值之间的映射数组。具体实现包括以下步骤: - **读取XML**:调用`readXml`函数读取`/etc/key.xml`文件,获取XML根节点。 - **解析按键**:通过调用`Pars_Key`函数来解析XML文件中定义的所有按键信息。其中,通过`value`属性获取原始码值,通过`name`属性获取键名字符串,再调用`find_linux_key_code`函数查询该键名字符串所对应的Linux层键值。 - **存储映射关系**:将这些映射关系存储到`keyarry`结构体中,具体为`keyarry->hi_keycode[keynum].ir_keycode = ir_keycode;` 和 `keyarry->hi_keycode[keynum].linux_keycode = linux_keycode;`。 **1.2.4** 文件路径:`/device/hisilicon/bigfish/system/ir_user/ir_user.cpp` - **编译并运行**:编译为后台进程`android_ir_user`并独立运行。 - **初始化映射**:在进程启动时,执行`main`入口函数,调用`get_keycode`完成`key.xml`文件中存储的原始码值与Linux层键值之间的映射关系,并将其存储到数组`keyarry`中。 - **处理按键事件**:通过建立`ir_sample_thread`线程读取原始码值,并根据`keyarry`中的映射关系将其转换为Linux层键值。最终,通过`ReportKeyEvent`函数将这些键值写入`/dev/vinput`设备,以便其他进程可以读取。 **1.3 总结** 为了防止其他厂商对设备进行操作,可以在离开前删除`/system/bin`目录下的`android_ir_user`文件。 #### 2. Framework层:Linux层键值转换为Android键值 **核心输入**:`/dev/input`,输入Linux键值 **核心输出**: 1. `getEvents()`,输出`RawEvent *buffer`,存储Linux层键值; 2. `mapKey()`,将Linux层键值转换为Android键值。 ##### 2.2 详细说明 **2.2.1** 文件路径:`/device/hisilicon/bigfish/prebuilts/Vendor_0001_Product_0001.kl` 此文件定义了Linux键值与键名字符串之间的对应关系,例如: ```ini key 113 MUTE ``` 这里,`113`表示Linux层键值,而`MUTE`则是对应的键名字符串。 **2.2.2** 文件路径:`/frameworks/native/include/input/KeycodeLabels.h` 该文件定义了键名字符串与Android Java层键值之间的对应关系,例如: ```cpp {"MUTE", 9} ``` 这里定义了一个名为`KEYCODES`的结构数组,用于存储键名字符串与Android Java层键值之间的映射关系。 **2.2.3** 转换逻辑 当从`/dev/input`读取到Linux层键值后,首先会调用`getEvents()`函数来获取按键事件,并将其存储到`RawEvent *buffer`中。然后,通过`mapKey()`函数将这些Linux层键值转换为对应的Android键值。这一过程依赖于`Vendor_0001_Product_0001.kl`与`KeycodeLabels.h`文件中定义的映射关系。 #### 结论 通过以上分析可以看出,Android系统对遥控器按键的处理涉及了从硬件层到应用框架层的多个环节。这一过程不仅体现了Android系统架构的设计思想,还反映了其在用户输入管理方面的灵活性与高效性。从原始码值到Linux层键值,再到Android Java层键值的转换,每一步都是精心设计且相互配合的。这对于理解Android系统的输入管理机制具有重要的意义。
剩余19页未读,继续阅读
- 粉丝: 1
- 资源: 9
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助