1.kl文件
kl文件,就是keylayout文件,它的作用是将scancode转换为keycode。scancode就是硬件直接扫描到的数字,而这些数字会通过这个kl文件对应到字符串,也就是keycode。
2.load kl 文件的过程
直接进入主题,过程是从在EventHub.cpp中开始的。EventHub.cpp的路径是frameworks/native/services/inputflinger。这个里面从打开设备入手。也就是下面这个函数。这里是部分代码。
status_t EventHub::openDeviceLocked(const char *devicePath) {
char buffer[80];
ALOGV("Opening device: %s", devicePath);
int fd = open(devicePath, O_RDWR | O_CLOEXEC);
if(fd < 0) {
ALOGE("could not open %s, %s\n", devicePath, strerror(errno));
return -1;
}
在这个函数的中间,会有下面这段代码。很显然,这就是开始load kl 文件了。
// Load the key map.
// We need to do this for joysticks too because the key layout may specify axes.
status_t keyMapStatus = NAME_NOT_FOUND;
if (device->classes & (INPUT_DEVICE_CLASS_KEYBOARD | INPUT_DEVICE_CLASS_JOYSTICK)) {
// Load the keymap for the device.
keyMapStatus = loadKeyMapLocked(device);
}
接下来,就看看函数loadKeyMapLocked()。这个函数的实现如下:
status_t EventHub::loadKeyMapLocked(Device* device) {
return device->keyMap.load(device->identifier, device->configuration);
}
接着看函数keyMap.load()。这个函数的实现是在如下。在没有丢log之前,一直以为,函数运行是走的是if (deviceConfiguration)这个路线。并且为了找出tryGetProperty(String8("keyboard.layout")函数所表达的意义纠结了很久。这个函数的实现是在system文件夹下面的core/libutils/PropertyMap.cpp中 。这个函数并不是传统的获取property,因为后面这个字符串在getprop之后没有找到。实际上是在初始化的时候创建了一个全局的类似链表还是数组结构,然后可以根据字符串对应上它的值。
status_t KeyMap::load(const InputDeviceIdentifier& deviceIdenfifier,
const PropertyMap* de