跟踪输入事件

通过跟踪工具,您可以直观呈现输入事件分派路径。您必须精心挑选每个时长和出站/入站流事件,以直观地了解事件路径中涉及哪些组件和函数路径。

触摸事件流

替代文本。
L1. 触摸驱动程序:Stack(FtDevice Read、HID IO Queue、InputReportInstance GetReports)。
L2. 流事件:InputReportInstance GetReports 到 touch-binding-process-report。L3. 输入流水线:Stack(input-device-process-reports, touch-binding-process-report)。
L4. 流事件:touch-binding-process-report 到 presentation_on_event。
L5. 输入流水线:Stack(presentation_on_event, touch-ject-into-scenic)。
L6. 流事件:touch-inject-into-scenic to Injector::Inject。
L7. View:Stack(Injector::Inject, dispatch_event_to_client, smooth_impl::Session::EventAndErrorReporter::EnqueueEvent, landscape_impl::Session::EventAndErrorReporter::FlushEvents)。
L8. 流事件:dispatch_event_to_client to PlatformView::OnHandlePointerEvent。
L9. Flutter Runner:Stack(PlatformView::OnScenicEvent, PlatformView::OnHandlePointerEvent, Shell::OnPlatformViewDispatchPointerDataPacket)。

触摸事件路径涉及触摸驱动程序组件、输入管线、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”时长关联起来。在接收端,触摸事件最终到达并由界面客户端组件进行处理。