Android Systrace(3) -- 掉帧卡顿
- 1. 丢帧看Surface Flinger trace发现他的ui thread并不是每一个vsync都有绘制,有发生丢帧,原因是launcher数据是空的
- 2. 查看lancher的trace,发现连续滑动时,每一帧都是成功绘制成功了,但是uiThread并不是都在doFrame,有些帧并没有做doFrame,原因是没有输入事件,可以看deliverInputEvent那些地方是空的
对应的 Launcher Trace如下 , 可以看到 Launcher 没有绘制的原因是没有 Input 事件传上来. 所以 Launcher 的画面没有更新, 所以才会出现掉帧.
- 3.查看InputDispatcher和inputReader
没有事件上来这个本身就是有问题的 , 我们手指是连续从屏幕上划过的, 事件的上报应该是连续的才对, 我们怀疑是屏幕报点有问题, 不过 Check 硬件之前我们首先看一下 InputReader 和 InputDispatcher 线程是否正常工作
正常的按键事件应该是一个inputDispatcher对应inputReader除非被过滤了
本例中,inputReader是正常的,inputDispatcher却少了,可见事件有传上来,但是分发出现问题
再回到有问题的那个图 , 仔细看发现 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/