android 能够将不同的低层 scancode 转化成上层使用的统一的 keycode (以下分析为 android 2.2 froyo 的)。下面说的几个相关的源代码文件都在 framework/base/libs/ui 下。
EventHub? .cpp
先看看下面这段代码:// 在 open_device 函数里 if ((device->classes&CLASS_KEYBOARD) != 0) { char devname[PROPERTY_VALUE_MAX]; char keylayoutFilename[300]; const char* root = getenv("ANDROID_ROOT"); property_get("persist.sys.keylayout", devname, "qwerty"); snprintf(keylayoutFilename, sizeof(keylayoutFilename), "%s/usr/keylayout/%s.kl", root, devname); bool defaultKeymap = access(keylayoutFilename, R_OK); if (defaultKeymap) { strcpy(devname, "qwerty"); snprintf(keylayoutFilename, sizeof(keylayoutFilename), "%s/usr/keylayout/%s.kl", root, devname); } LOGI("keylayout = %s, Filename = %s", devname, keylayoutFilename); device->layoutMap->load(keylayoutFilename);