Android Systrace(3) -- 掉帧卡顿

 

  • 1. 丢帧看Surface Flinger trace发现他的ui thread并不是每一个vsync都有绘制,有发生丢帧,原因是launcher数据是空的

 

Android Systrace(3) -- 掉帧卡顿_第1张图片

  • 2. 查看lancher的trace,发现连续滑动时,每一帧都是成功绘制成功了,但是uiThread并不是都在doFrame,有些帧并没有做doFrame,原因是没有输入事件,可以看deliverInputEvent那些地方是空的

 

对应的 Launcher Trace如下 , 可以看到 Launcher 没有绘制的原因是没有 Input 事件传上来. 所以 Launcher 的画面没有更新, 所以才会出现掉帧.

Android Systrace(3) -- 掉帧卡顿_第2张图片

 

  • 3.查看InputDispatcher和inputReader

 

没有事件上来这个本身就是有问题的 , 我们手指是连续从屏幕上划过的, 事件的上报应该是连续的才对, 我们怀疑是屏幕报点有问题, 不过 Check 硬件之前我们首先看一下 InputReader 和 InputDispatcher 线程是否正常工作

正常的按键事件应该是一个inputDispatcher对应inputReader除非被过滤了

Android Systrace(3) -- 掉帧卡顿_第3张图片

 

 

本例中,inputReader是正常的,inputDispatcher却少了,可见事件有传上来,但是分发出现问题

 

Android Systrace(3) -- 掉帧卡顿_第4张图片

再回到有问题的那个图 , 仔细看发现 InputDispatcher 线程的周期是和 Vsync 是相同的, 也就是说, InputDispatcher 的唤醒逻辑由 InputReader 唤醒变为由 Vsync 唤醒

再仔细看的话,点开 InputDIspatcher 的线程 cpu 状态可以看到, 唤醒执行任务的 InputDispatcher 线程并不是被 InputReader 线程唤醒的, 而是被 System_Server 的 UI Thread 唤醒的.

那么接下来, 就需要从代码的角度来看为什么 InputReader 没有唤醒 InputDIspatcher 。

 

后续的详细分析请参考链接,是否掉帧应该看SurfaceFlinger Ui thread而不是看app,可能app UI thread是Frame没有绘制,但是如果此时有缓存buffer,是会使用缓存buffer

 

参考链接

 

https://androidperformance.com/2019/01/21/android-performance-case-jank-accessbility/

你可能感兴趣的:(Systrace)