跳转至

通过log中的坐标转成折线图

背景

经常有用户报一些滑动卡顿、抖动的问题;如果sf分析下来发现没有掉帧,应用接下来往往都会怀疑input有问题。而input遇到这种问题最难分析的原因是: - input log非常少 - input 坐标log即使有打印,也不直观

所以,我们就想办法从log中获取到x,y数据,并转换成折线图。

InputDispatcher::logOutboundMotionDetails

在logOutboundMotionDetails()里会打印出 x,y 坐标,但前提是打开了 DEBUG_OUTBOUND_EVENT_DETAILS

打印的log如下:

11-24 15:54:55.297  2690  3885 D InputDispatcher:   Pointer 0: id=0, toolType=FINGER, x=1159.152710, y=1975.381226, pressure=1.000000, size=0.486275, touchMajor=123.935303, touchMinor=123.935303, toolMajor=123.935303, toolMinor=123.935303, orientation=0.000000

那我们通过脚本去过滤掉 x,y 坐标,放到 excel 中就可以生成折线图了。

file = "/home/solo/bug/log/InputDispatcher.txt"  
with open(file, 'r') as f:  
    for line in f.readlines():  
        if "InputDispatcher" in line and "x=" in line and "y=" in line:  
            array = line.split(",")  
            x_str = array[2]  
            y_str = array[3]  

            x = x_str.replace("x=", "").strip()  
            y = y_str.replace("y=", "").strip()  

            print(x, y)

根据打印出来的 x,y 放到 excel 中即可。

input 命令模拟 swipe

如脚本,模拟左右滑动:(y坐标不变)

while (true)  
do  
    adb shell input swipe 800 1000 200 1000 1000;  
    sleep 1.5;  
    adb shell input swipe 200 1000 800 1000 1000;  
    sleep 1.5;  
done

win系统脚本如下:

:loop
    adb shell input swipe 800 1000 200 1000 1000;
    TIMEOUT /T 1 /NOBREAK
    adb shell input swipe 200 1000 800 1000 1000;
    TIMEOUT /T 1 /NOBREAK
goto loop
:end

然后得出的折线图:

人为滑动

人为在屏幕上滑动也是通过脚本获取到x,y 坐标放到 excel 中,得到的折线图:

这样对比下来有很明显的不平滑,则可以说明 inputflinger 本身并没问题。 而是bsp报点可能有问题了,需要bsp分析。

评论