zoukankan      html  css  js  c++  java
  • Android4.2.2由于越来越多的物理按键(frameworks)

    当我们改变frameworks之后可能:
    make: *** [out/target/common/obj/PACKAGING/checkapi-current-timestamp] 错误 38
    解决方案:make update-api


    在Android中加入物理按键:KEYCODE_HELP
    1、Android 添加按键:
    ScanCode -> KeyCodeLabel -> KeyCode -> Keyevent
    -----
    1) 键扫描码ScanCode是由linux的Input驱动框架定义的整数类型,可參考input.h头文件(./external/kernel-headers/original/linux/input.h)。
    2) 按键码(KeyCode)。这个按键码是一个整数,在上层的JAVA程序中主要通过这个值来推断系统的实现。
    ----
    实现过程:
    1, ScanCode -> KeyCodeLabel。
    键盘布局文件(*.kl) 把ScanCode转换为KeyCodeLabel。

    *.kl文件在源代码的devices目录中如(/device/rockchip/rk30sdk_bnd/rk29-keypad.kl)或设备中的/system/usr/keylayout/*.kl。


    key 138   HELP      //这里的HELP就是我们定义的android键值的字符形式,138则是linux键值, HELP 不能无缘无故就使用。必定有定义位置,这个位置就是KeycodeLabels.h
    2,KeyCodeLabel -> KeyCode。
    通过查找KEYCODES[]数组,得到KeyCodeLabel字符串相应的KeyCode值。

    KEYCODES[]在文件/frameworks/base/include/androidfw/KeycodeLabels.h 中。


    这里定义的实际上是我们在kl文件,也就是linux key到android key的一个映射表中的linux键值和android键值的名称;比方rk29-keypad.kl:
    static const KeycodeLabel KEYCODES[] = {
    ...
        { "ASSIST", 219 },
         //add by hcm
        { "HELP", 220 },
    在/frameworks/native/include/android/keycodes.h中定义KeyCode的枚举值。
    enum {
    ....
        AKEYCODE_ASSIST          = 219,
        //add by hcm
        AKEYCODE_HELP          = 220,
    ......}
    在EventHub.cpp中载入并解析这个map:rk29-keypad.kl。那么得到的是linux键值138为key的string,这个string就是HELP,有了上面这个KEYCODES数组。就能够获得它相应的android键值了。




    3,KeyCode -> Keyevent。
    KeyEvent.java中的相应KeyCode:(文件路径:/frameworks/base/core/java/android/view/KeyEvent.java)。
    KeyEvent.java中有一个很重要的提示,那就是我们自己填特殊按键的流程,可是我这是瑞芯微3168,Android4.2.2的源代码,源代码中的凝视路径是有误的!


    // NOTE: If you add a new keycode here you must also add it to:
        //  isSystem()
        //  native/include/android/keycodes.h
        //  frameworks/base/include/ui/KeycodeLabels.h 应该为:/frameworks/base/include/androidfw/KeycodeLabels.h
        //  external/webkit/WebKit/android/plugins/ANPKeyCodes.h
        //  frameworks/base/core/res/res/values/attrs.xml
        //  emulator?
        //  LAST_KEYCODE
        //  KEYCODE_SYMBOLIC_NAMES
        //
        //  Also Android currently does not reserve code ranges for vendor-
        //  specific key codes.  If you have new key codes to have, you
        //  MUST contribute a patch to the open source project to define
        //  those new codes.  This is intended to maintain a consistent
        //  set of key code definitions across all Android devices.
    假设修改了KeyEvent,影响到API则须要调用make update-api。
    LAST_KEYCODE改动:
        /** Key code constant: add by hcm, help key. */
        public static final int KEYCODE_HELP          = 220;
        private static final int LAST_KEYCODE           = KEYCODE_HELP;
    ....
    (KEYCODE_SYMBOLIC_NAMES改动)
            names.append(KEYCODE_ASSIST, "KEYCODE_ASSIST");
            names.append(KEYCODE_HELP, "KEYCODE_HELP");
    ....
    4、依据上面提示改动isSystem()。代码跟踪:
    isSystem() 在/frameworks/base/core/java/android/view/KeyEvent.java
    public final boolean isSystem() {
    return native_isSystemKey(mKeyCode);
    }
     
    /frameworks/base/core/jni/android_view_KeyEvent.cpp
    static jboolean native_isSystemKey(JNIEnv* env, jobject clazz, jint keyCode) {
    return KeyEvent::isSystemKey(keyCode);
    }
     
    /frameworks/base/libs/androidfw/Input.cpp
    bool KeyEvent::isSystemKey(int32_t keyCode) {
    switch (keyCode) {
    ……
            case AKEYCODE_SEARCH:
    //add by hcm
            case AKEYCODE_HELP:
    }
    }
    5、/external/webkit/Source/WebKit/android/plugins/ANPKeyCodes.h
    enum ANPKeyCodes {
    ……
     
        kAppSwitch_ANPKeyCode = 187,
    //add by hcm
        kHelp_ANPKeyCode = 220,
    };
    6、frameworks/base/core/res/res/values/attrs.xml
    <attr name="keycode">
     .....................
         <enum name="KEYCODE_RO" value="217" />
            <enum name="KEYCODE_KANA" value="218" />
            <enum name="KEYCODE_HELP" value="220" />
        </attr>
    </attr>


    这些操作完毕了之后,就完毕了linux键到android的键值映射。也就是android在超过一个KEYCODE_HELP其值它是220.

    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    谁记录了mysql error log中的超长信息(记pt-stalk一个bug的定位过程)
    谈谈MySQL无法连接的原因和分析方法
    MySQL 5.7基于GTID复制的常见问题和修复步骤(二)
    日常运维故障记录和解决
    python学习之-- 故障记录汇总
    sshpass-Linux命令之非交互SSH密码验证
    python 之 线程池实现并发
    python 之 实现su 到root账号
    shell
    shell
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4913241.html
Copyright © 2011-2022 走看看