通过跟踪工具,您可以直观呈现输入事件分派路径。您必须精心挑选每个时长和出站/入站流事件,以直观地了解事件路径中涉及哪些组件和函数路径。
触摸事件流
触摸事件路径涉及触摸驱动程序组件、输入管线、Scape 和紫红色视图组件(在此示例中为 Flutter)。每个组件占据一个水平条带,其函数调用堆栈序列按时间顺序排列。
驱动程序从设备读取触摸事件并创建 Fuchsia.input.report.InputReport。驱动程序的调用堆栈在此表示为“HID IO Queue”和“InputReportInstance GetReports”。
有一个数据流事件会将“InputReportInstance GetReports”连接到输入流水线中的下一个时长“touch-binding-process-reports”。FIDL 协议方法是 fuchsia.input.report.InputReportsReader.ReadInputReports()。
输入流水线中有一个将“touch-binding-process-reports”与“presentation_on_event”相连的流事件。由于输入流水线实现中的任务循环安排,因此它们在不同的函数调用堆栈中表示。
“presentation_on_event”命名方式是一种旧版沿用方式,可让基于跟踪记录的指标输入延迟脚本继续正常运行。我们建议所有者更改时长和流程的名称以符合实际意图,但可能还需要更新受影响的脚本。通常,跟踪计算脚本有一个“冒烟测试”以防止完全中断,因此 CQ 应捕获不良更改。
有一个数据流事件将输入流水线的“touch-ject-into-scenic”连接到 Views 的“Injector::Inject”持续时间。FIDL 协议方法是 fuchsia.ui.pointerinjector.Device.Inject()。“touch-ject-into-scenic”时长构建为在 Inject() 调用时结束,以故意排除返回确认。“presentation_on_event”的总体时长也会捕获回报,因此该值的长度也更长。
View 调用堆栈由“Injector::Inject”“dispatch_event_to_client”和一些其他函数组成。有一个数据流事件会将“dispatch_event_to_client”时长与 Flutter 的“PlatformView::OnHandlePointerEvent”时长关联起来。在接收端,触摸事件最终到达并由界面客户端组件进行处理。