1. 前言
android系统有时候会有添加新键值的需求,底层方面和上层方面可能会由于发行平台,芯片厂商和系统版本的原因会存在一定差异,但原理基本相同,个人理解就是收到原始信号之后,底层键值与上层键值进行一一映射,然后在上层处理相应键值。下面就举例一个新键值,首页键添加过程中所要修改的点。
2. 驱动层
驱动层键值信号传递跟芯片厂商有关,就以hisi芯片Android4.4版本为例:
驱动层收到原始信号之后进行映射:
key.xml
<other>
<key value="0x34cbff33" name="KEY_HOME" />
</other>
value的值为收到的原始信号值,键值信号会通过name变量值映射往上层抛
linux_key.h
{"KEY_HOME", 102 }
3. native层
kl文件对应驱动的键值
key 102 HOME
再往上:
./framworks/native/include/input/KeycodeLabels.h
static const KeycodeLabel KEYCODES[] = {
......
{ "HOME", 3 },
......
};
./framwork/native/include/android/keycodes.h
enum {
......
AKEYCODE_HOME = 3,
......
};
4. java层
./framworks/base/core/java/android/view/KeyEvent.java
public static final int KEYCODE_HOME = 3;
names.append(KEYCODE_HOME, "KEYCODE_HOME");
5. 添加到资源文件
./framworks/base/core/res/res/values/attrs.xml
<enum name="KEYCODE_HOME" value="3" />
6. 消费键值
./framworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags, boolean isScreenOn) {
......
switch (keyCode) {
case KeyEvent.KEYCODE_HOME:
return result;
}
......
}