我们在Android系统开发的时候经常遇到界面点击没作用,或点击有飘逸的情况,这个时候我们需要通过查看TP是否有上报数据以及Framework层input事件日志进一步的分析,是否是TP在上报数据异常导致还是上层APP本身引起的问题,具体如下:
1、 如何用getevent查看TouchPanel上报数据?
[SOLUTION]
步骤如下:
1)先使用adb shell连接手机。
2)在命令行输入命令" cat /proc/bus/input/devices",查看"Name="mtk-tpd"“项中的”Handlers=“对应哪个event?
3)在命令行输入命令" getevent /dev/input/event?”
如下所示:
cat /proc/bus/input/devices
输出:
I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="mtk-tpd"
P: Phys=
S: Sysfs=/devices/virtual/input/input3
U: Uniq=
H: Handlers=mouse0 event3 -----即鼠标对应的event为event3
B: PROP=2
B: EV=b
B: KEY=400 0 0 0 0 1000 40000800 0 0 0 0
B: ABS=2630000 1000003
然后输入命令:
getevent /dev/input/event3
2、如何抓取framework层input事件相关的日志
出现事件输入相关的问题时, 首先通过第一章节来检测对应的设备是否有响应输入,如果没有响应输入,则可能是 driver 或者输入设备模组问题,如果有输入设备响应输入, 则需要打开以下 log 开关,抓取mtklog 检查 framework 层的对事件的处理 ,方法如下:
注意:
USER版本只能使用静态方式(修改代码)打开debug开关
ENG版本可以使用动态方式(命令)打开debug开关
1、App 层 (client) 适用于JB,KK,L,M版本:
1.1)动态开启APP层LOG方法如下:
adb shell setprop debug.viewroot.enable 7000
adb shell setprop debug.view.keylog true
adb shell setprop debug.view.touchlog true
adb shell setprop debug.view.motionlog true
adb shell stop
adb shell start
需等待机器软件重启后才能生效
1.2)静态修改请直接修改DEBUG的值:
开启ViewRootImpl/View/ViewGroup中input event的处理过程的log开关:
frameworks/base/core/java/android/view/viewrootimpl.java 中的 DEBUG_INPUT 开关(设置为 true);
frameworks/base/core/java/android/view/viewgroup.java 中的 DBG_MOTION ,DBG_TOUCH开关 (设置为 true);
frameworks/base/core/java/android/view/view.java 中的 DBG_MOTION ,DBG_TOUCH开关 (设置为 true);
frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindow.java 中的 DBG_MOTION 开关 (设置为 true);
frameworks/base/core/java/android/view/KeyEvent.java 中的 DEBUG 开关 (设置为 true);
2、framework(server):
2.1 动态打开方法 (适用于KK,L,M. 其中KK只适用于eng build, L,M适用于eng build 和user build):
adb shell setprop sys.inputlog.enabled true
adb shell dumpsys input
不用重启手机就可以生效,重启手机后会失效。
2.2 静态开启方法:
frameworks/base/services/input/inputReader.cpp (for ICS & JBx ,KK版本)
frameworks/native/services/inputFlinger/inputReader.cpp (for L ,M版本)
找到以下宏定义, 并将其值改为如下
#define DEBUG_RAW_EVENTS 1
#define DEBUG_HACKS 1
#define DEBUG_VIRTUAL_KEYS 1
#define DEBUG_POINTERS 1
#define DEBUG_POINTER_ASSIGNMENT 1
#define DEBUG_GESTURES 1
#define DEBUG_VIBRATOR 1
frameworks/base/services/input/inputDispatcher.cpp (for ICS & JBx ,KK版本)
frameworks/native/services/inputFlinger/inputDispatcher.cpp (for L, M 版本)
找到以下宏或变量定义, 并将其值改为如下
#else // 改 else 分支中的定义
#define DEBUG_INBOUND_EVENT_DETAILS 1
#define DEBUG_OUTBOUND_EVENT_DETAILS 1
#define DEBUG_DISPATCH_CYCLE 1
#define DEBUG_REGISTRATION 1
#define DEBUG_INJECTION 1
#define DEBUG_FOCUS 1
#define DEBUG_APP_SWITCH 1
#define DEBUG_HOVER 1
#endif
bool gInputLogEnabled = true;
frameworks/base/libs/androidfw/inputTransport.cpp (for ICS & JBx 版本)
找到以下宏或变量定义, 并将其值改为如下
#else // 改 else 分支中的定义
#define DEBUG_CHANNEL_MESSAGES 1
#define DEBUG_CHANNEL_LIFECYCLE 1
#define DEBUG_TRANSPORT_ACTIONS 1
#define DEBUG_RESAMPLING 1
#endif
static bool gInputLogEnabled = true;
frameworks/native/libs/input/inputTransport.cpp (for KK,L ,M版本)
找到以下变量定义, 并将其值改为如下
static bool gInputLogEnabled = true;
3、因为很多input无响应的问题,常常会跟window的focus扯上关系,如果有需要
可以用下面的命令打开ams和wms的LOG。
adb shell dumpsys activity log x on
adb shell dumpsys window -d enable a