android13 app的触摸问题定位分析流程
一、知识点
一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。
问题描述:
【操作步骤】
1.在主驾屏状态栏位置处向下滑出负一屏
2.点击副驾屏应用区域
【预期结果】 2.可以打开对应应用
【实际结果】 2.副驾屏区域的所有点击按钮都无效
【问题发生时间】2025/06/06 15:32
二、问题分析
-
凡是触摸问题,先在ViewRootImpl.java 里面添加log:
添加log之后,发现deliverInputEvent并没有发送给对应的app window,这就说明input问题出在deliver之前,需要借助dump input命令来分析。 -
dump命令:
adb shell dumpsys activity a> activitys.log
adb shell dumpsys activity > activity.log
adb shell dumpsys activity -v top > top_activity.log
adb shell dumpsys window w > ws.log
adb shell dumpsys SurfaceFlinger > sf.log
adb shell dumpsys display > display.log
adb shell dumpsys power > power.log
adb shell dumpsys input > input.log
adb shell dumpsys package > package.log
adb shell screencap /sdcard/1.png
adb pull /sdcard/1.png
主要是adb shell dumpsys input > input.log进行分析,查看touchableRegion是否正确。
通过打印堆栈的方式,定位touchableRegion计算逻辑。详细的堆栈信息如下:
06-06 19:33:37.158 1787 1812 W android100: setTouchableRegion, region = SkRegion((-5160,-1600,10200,3200)),mHandle = f9b4570 SystemUIOverlayWindow, frame=[0,0,0,0], touchableRegion=SkRegion((-5160,-1600,10200,3200)), scaleFactor=1.0, transform=null, windowToken=android.os.BinderProxy@d9e02ed, isClone=false,callstack =
06-06 19:33:37.158 1787 1812 W android100: java.lang.Throwable: xxx
06-06 19:33:37.158 1787 1812 W android100: at com.android.server.wm.InputWindowHandleWrapper.setTouchableRegion(InputWindowHandleWrapper.java:142)
06-06 19:33:37.158 1787 1812 W android100