调试按键异常 - Power键报键值的状态不正确

问题:本来要做开关机键,但是在PhoneWindow收到的键值是一直打印Power按下,看log得知,当按下Power键时,先报一个Power keyup,再报Power keydown,又报了一个Power keyup,一直系统认为Power键一直处理按下状态。所以暂时只能用其他键代替实现开关机


1.了解基本流程      
1)内核处理按键,通过设备文件的方式提供给framework层
2)framework层的KeyInputQueue.java启动线程从设备文件中读出键码,然后把读出的键码按kl文件转成相应键值(JNI调用EventHub.cpp),最后写入事件队列
     ps:读取键盘具体应该是eventHub类处理
3)framework层的WindowManagerService.java启动线程从事件队列中读出键值,然后根据当前focus分发给相应窗口
     ps:刚才是 读 键码,现在是键值。
4)UI通过KeyCharacterMap.java处理kcm规则将用户基本按键与功能键(Shift, Alt等)组合,得出最终按键
5)设备中断-------驱动------>内核按键码(SCANCODE)-------*.kl--------> android keycode(char*)--------- KeycodeLabels.h ------>android keyevent(int, KeyEvent.java)
B:android keycode(char*)--------------- *.kcm/*.kcm.bin ------------>显示字符(char)

2. 定位问题,有几个关键点:
1). 首先要区分是kernel处理不正确还是上层处理不正确,这个时候要用到一下命令了,因为android层读kernel是读的/dev/input/event*,getevent使用如下
getevent 监控当前的事件,鼠标事件,按键事件,拖动滑动等
root@android:/ # getevent&
//显示输入设备信息
getevent&
[1] 13105
root@android:/ # add device 1: /dev/input/event3
 name:     "EN LE  SMART REMOTE     "
add device 2: /dev/input/event2
 name:     "EN LE  SMART REMOTE     "
add device 3: /dev/input/event0
 name:     "rk29-keypad"
add device 4: /dev/input/event1
 name:     "rkxx-remotectl"
 
点击方向键的上键,打印如下:
 root@android:/ # /dev/input/event2: 0004 0004 00070052
/dev/input/event2: 0001 0067 00000001
/dev/input/event2: 0000 0000 00000000
/dev/input/event2: 0004 0004 00070052
/dev/input/event2: 0001 0067 00000000
/dev/input/event2: 0000 0000 00000000
其中:
/dev/input/event2是设备的名字,也就是驱动操作的是这个设备
第一行第二列的0001是type,(具体用途还不是很清楚,希望牛人补充)
第一行第三列的0067是个十六进制数,十进制是103,代表按键码,对应rkxx-remotectl.kl中的
key 103 DPAD_UP
第一行第四列的00000001根据type的不同而不同,例如type=0001,则这一列的取值只有00000001代表按下,keydown;00000000代表松开,keyup

2). 如果是驱动问题,则打印上报值的函数,及看看对于输入子系统有没有修改
3). 如果是android处理不正确
大致流程是这样的:sys上报到frameworks/services/input/EventHub.cpp中,在这里会对设备进行扫描并且判断是哪种设备,然后在InputReader.cpp中对原始数据进行读取。在framewoks/services/input/InputDispatcher.cpp中实现数据的派发。在framework/base/core/jni/android_view_KeyEvent.cpp中实现通过JNI机制向上层的KeyEvent.java提供数据。并且在frameworks/base/core/java/android/view/KeyEvent.java中向上层的APP开发人员提供接口。

附加:

1). 如果想对按键进行处理,一般在这个PhoneWindowManager.java文件中进行截获并处理的。当然也有的在PhoneWindow.java里处理,看具体情况。

2).整个流程相关代码    
1)frameworks/base/core/java/android/view/KeyEvent.java(按键事件定义)
2)frameworks/base/services/java/com/android/server/KeyInputQueue.java(事件读取线程)
     //PS:相当于getMessage,待定。
3)frameworks/base/services/java/com/android/server/WindowManagerService.java(事件分发线程)
     //PS:相当于postMessage,sendMessage ,待定。
4)frameworks/base/core/java/android/view/KeyCharacterMap.java(功能键转换kcm)
5)frameworks/base/libs/ui/EventHub.cpp(键码与键值转换)

6)frameworks/base/policy/src/com/android/interanl/policy/impl/PhoneWindowManager.java(事件处理)

3. 分析原因:

执行#getevent&

点击Power键,查看log

。。。

发现dev/input/event3上报的键值状态不正确,因此可定位为Kernel问题


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值