Oksana Zhuravlova | dc564fd | 2024-12-02 23:51:02 | [diff] [blame^] | 1 | -- Copyright 2024 The Chromium Authors |
| 2 | -- Use of this source code is governed by a BSD-style license that can be |
| 3 | -- found in the LICENSE file. |
| 4 | |
| 5 | INCLUDE PERFETTO MODULE slices.with_context; |
| 6 | |
| 7 | -- This module defines tables with information about Android input pipeline |
| 8 | -- steps. The trace needs to be recorded with the 'view' atrace category. |
| 9 | |
| 10 | -- On Android, input goes through the following path before getting to Chrome: |
| 11 | -- * InputReader thread (part of Android system_server) |
| 12 | -- * InputDispatcher thread (part of Android system_server) |
| 13 | -- * Browser Main thread (Chromium/Chrome) |
| 14 | |
| 15 | -- In traces, each of these three steps have slices which are implicitly linked |
| 16 | -- together by an input id (part of slice name) assigned by the Android system. |
| 17 | |
| 18 | -- The following queries correlate the three steps mentioned above |
| 19 | -- with the rest of the `LatencyInfo.Flow` pipeline. |
| 20 | |
| 21 | -- InputReader is the first step in the input pipeline. |
| 22 | -- It is responsible for reading the input events from the system_server |
| 23 | -- process and sending them to the InputDispatcher (which then sends them |
| 24 | -- to the browser process). |
| 25 | |
| 26 | CREATE PERFETTO TABLE _chrome_android_motion_input_reader_step( |
| 27 | -- Input reader step timestamp. |
| 28 | ts TIMESTAMP, |
| 29 | -- Input reader step duration. |
| 30 | dur DURATION, |
| 31 | -- Input reader step slice id. |
| 32 | id LONG, |
| 33 | -- Input id. |
| 34 | android_input_id STRING, |
| 35 | -- Input reader step utid. |
| 36 | utid LONG |
| 37 | ) |
| 38 | AS |
| 39 | SELECT |
| 40 | ts, |
| 41 | dur, |
| 42 | id, |
| 43 | -- Get the substring that starts with 'id=', remove the 'id=' and remove the trailing ')'. |
| 44 | -- 'id=0x344bb0f9)' -> '0x344bb0f9' |
| 45 | TRIM( |
| 46 | SUBSTR( |
| 47 | SUBSTR(name, INSTR(name, 'id=')) |
| 48 | , 4), |
| 49 | ')') |
| 50 | AS android_input_id, |
| 51 | utid |
| 52 | FROM thread_slice AS slice |
| 53 | WHERE |
| 54 | name GLOB 'UnwantedInteractionBlocker::notifyMotion*'; |
| 55 | |
| 56 | -- InputDispatcher is the second step in the input pipeline. |
| 57 | -- It is responsible for dispatching the input events to the browser process. |
| 58 | CREATE PERFETTO TABLE _chrome_android_motion_input_dispatcher_step( |
| 59 | -- Input dispatcher step timestamp. |
| 60 | ts TIMESTAMP, |
| 61 | -- Input dispatcher step duration. |
| 62 | dur DURATION, |
| 63 | -- Input dispatcher step slice id. |
| 64 | id LONG, |
| 65 | -- Input id. |
| 66 | android_input_id STRING, |
| 67 | -- Input dispatcher step utid. |
| 68 | utid LONG |
| 69 | ) |
| 70 | AS |
| 71 | SELECT |
| 72 | ts, |
| 73 | dur, |
| 74 | id, |
| 75 | TRIM( |
| 76 | SUBSTR( |
| 77 | SUBSTR(name, INSTR(name, 'id=')) |
| 78 | , 4), ')') |
| 79 | AS android_input_id, |
| 80 | utid |
| 81 | FROM thread_slice AS slice |
| 82 | WHERE |
| 83 | name GLOB 'prepareDispatchCycleLocked*chrome*'; |
| 84 | |
| 85 | -- DeliverInputEvent is the third step in the input pipeline. |
| 86 | -- It is responsible for routing the input events within browser process. |
| 87 | CREATE PERFETTO TABLE chrome_deliver_android_input_event( |
| 88 | -- Timestamp. |
| 89 | ts TIMESTAMP, |
| 90 | -- Touch move processing duration. |
| 91 | dur DURATION, |
| 92 | -- Utid. |
| 93 | utid LONG, |
| 94 | -- Input id (assigned by the system, used by InputReader and InputDispatcher) |
| 95 | android_input_id STRING |
| 96 | ) AS |
| 97 | SELECT |
| 98 | slice.ts, |
| 99 | slice.dur, |
| 100 | slice.utid, |
| 101 | SUBSTR(SUBSTR(name, INSTR(name, 'id=')), 4) AS android_input_id |
| 102 | FROM |
| 103 | thread_slice AS slice |
| 104 | WHERE |
| 105 | slice.name GLOB 'deliverInputEvent*'; |
| 106 | |
| 107 | -- Collects information about input reader, input dispatcher and |
| 108 | -- DeliverInputEvent steps for the given Android input id. |
| 109 | CREATE PERFETTO TABLE chrome_android_input( |
| 110 | -- Input id. |
| 111 | android_input_id STRING, |
| 112 | -- Input reader step start timestamp. |
| 113 | input_reader_processing_start_ts TIMESTAMP, |
| 114 | -- Input reader step end timestamp. |
| 115 | input_reader_processing_end_ts TIMESTAMP, |
| 116 | -- Input reader step utid. |
| 117 | input_reader_utid LONG, |
| 118 | -- Input dispatcher step start timestamp. |
| 119 | input_dispatcher_processing_start_ts TIMESTAMP, |
| 120 | -- Input dispatcher step end timestamp. |
| 121 | input_dispatcher_processing_end_ts TIMESTAMP, |
| 122 | -- Input dispatcher step utid. |
| 123 | input_dispatcher_utid LONG, |
| 124 | -- DeliverInputEvent step start timestamp. |
| 125 | deliver_input_event_start_ts TIMESTAMP, |
| 126 | -- DeliverInputEvent step end timestamp. |
| 127 | deliver_input_event_end_ts TIMESTAMP, |
| 128 | -- DeliverInputEvent step utid. |
| 129 | deliver_input_event_utid LONG |
| 130 | ) AS |
| 131 | SELECT |
| 132 | _chrome_android_motion_input_reader_step.android_input_id, |
| 133 | _chrome_android_motion_input_reader_step.ts AS input_reader_processing_start_ts, |
| 134 | _chrome_android_motion_input_reader_step.ts + |
| 135 | _chrome_android_motion_input_reader_step.dur AS input_reader_processing_end_ts, |
| 136 | _chrome_android_motion_input_reader_step.utid AS input_reader_utid, |
| 137 | _chrome_android_motion_input_dispatcher_step.ts AS input_dispatcher_processing_start_ts, |
| 138 | _chrome_android_motion_input_dispatcher_step.ts + |
| 139 | _chrome_android_motion_input_dispatcher_step.dur AS input_dispatcher_processing_end_ts, |
| 140 | _chrome_android_motion_input_dispatcher_step.utid AS input_dispatcher_utid, |
| 141 | chrome_deliver_android_input_event.ts AS deliver_input_event_start_ts, |
| 142 | chrome_deliver_android_input_event.ts + |
| 143 | chrome_deliver_android_input_event.dur AS deliver_input_event_end_ts, |
| 144 | chrome_deliver_android_input_event.utid AS deliver_input_event_utid |
| 145 | FROM |
| 146 | _chrome_android_motion_input_reader_step |
| 147 | LEFT JOIN |
| 148 | _chrome_android_motion_input_dispatcher_step USING(android_input_id) |
| 149 | LEFT JOIN |
| 150 | chrome_deliver_android_input_event USING(android_input_id) |