xref: /aosp_15_r20/external/perfetto/src/trace_processor/perfetto_sql/stdlib/android/app_process_starts.sql (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1--
2-- Copyright 2024 The Android Open Source Project
3--
4-- Licensed under the Apache License, Version 2.0 (the "License");
5-- you may not use this file except in compliance with the License.
6-- You may obtain a copy of the License at
7--
8--     https://www.apache.org/licenses/LICENSE-2.0
9--
10-- Unless required by applicable law or agreed to in writing, software
11-- distributed under the License is distributed on an "AS IS" BASIS,
12-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13-- See the License for the specific language governing permissions and
14-- limitations under the License.
15--
16INCLUDE PERFETTO MODULE slices.with_context;
17
18-- All process starts.
19CREATE PERFETTO VIEW _proc_start
20AS
21SELECT ts, dur, TRIM(SUBSTR(name, 12)) AS process_name
22FROM thread_slice
23WHERE name GLOB 'Start proc:*' AND process_name = 'system_server';
24
25-- Broadcast, service and activity cold starts.
26CREATE PERFETTO TABLE _cold_start
27AS
28WITH
29  lifecycle_slice AS (
30    SELECT
31      id,
32      ts AS intent_ts,
33      dur AS intent_dur,
34      track_id,
35      name,
36      upid,
37      process_name,
38      pid,
39      utid,
40      CASE
41        WHEN name GLOB 'performCreate:*' THEN 'activity'
42        WHEN name GLOB 'serviceCreate:*' THEN 'service'
43        WHEN name GLOB 'broadcastReceiveComp:*' THEN 'broadcast'
44      END AS reason,
45            CASE
46        WHEN name GLOB 'performCreate:*' THEN STR_SPLIT(name, 'performCreate:', 1)
47        WHEN name GLOB 'serviceCreate:*' THEN STR_SPLIT(STR_SPLIT(name, '=', 2), ' ', 0)
48        WHEN name GLOB 'broadcastReceive*' THEN STR_SPLIT(name, 'broadcastReceiveComp:', 1)
49        END AS intent
50    FROM thread_slice slice
51    WHERE
52      name GLOB 'bindApplication'
53      OR name GLOB 'performCreate:*'
54      OR name GLOB 'serviceCreate:*'
55      OR name GLOB 'broadcastReceiveComp:*'
56    ORDER BY ts
57  ),
58  cold_start AS (
59    SELECT
60      *,
61      lag(name) OVER (PARTITION BY track_id ORDER BY intent_ts) AS bind_app_name,
62      lag(intent_ts) OVER (PARTITION BY track_id ORDER BY intent_ts) AS bind_app_ts,
63      lag(intent_dur) OVER (PARTITION BY track_id ORDER BY intent_ts) AS bind_app_dur,
64      lag(id) OVER (PARTITION BY track_id ORDER BY intent_ts) AS bind_app_id
65    FROM lifecycle_slice
66  )
67SELECT * FROM cold_start WHERE bind_app_name = 'bindApplication';
68
69-- Join Broadcast, service and activity cold starts with process starts.
70CREATE PERFETTO VIEW _cold_proc_start
71AS
72SELECT
73  cold_start.*,
74  MAX(proc_start.ts) AS proc_start_ts,
75  proc_start.dur AS proc_start_dur,
76  cold_start.intent_ts - MAX(proc_start.ts) + cold_start.intent_dur AS total_dur
77FROM _cold_start cold_start
78JOIN _proc_start proc_start
79  ON proc_start.process_name = cold_start.process_name AND cold_start.intent_ts > proc_start.ts
80GROUP BY cold_start.upid;
81
82-- Provider cold starts.
83CREATE PERFETTO TABLE _provider_start
84AS
85WITH
86  provider_start AS (
87    SELECT id AS bind_app_id FROM slice WHERE name = 'bindApplication'
88    EXCEPT
89    SELECT bind_app_id FROM _cold_start
90  )
91SELECT * FROM provider_start JOIN thread_slice ON id = bind_app_id;
92
93-- Join Provider cold starts with process starts.
94CREATE PERFETTO VIEW _provider_proc_start
95AS
96SELECT
97  cold_start.*,
98  MAX(proc_start.ts) AS proc_start_ts,
99  proc_start.dur AS proc_start_dur,
100  cold_start.ts - MAX(proc_start.ts) + cold_start.dur AS total_dur
101FROM _provider_start cold_start
102JOIN _proc_start proc_start
103  ON proc_start.process_name = cold_start.process_name AND cold_start.ts > proc_start.ts
104GROUP BY cold_start.upid;
105
106-- All app cold starts with information about their cold start reason:
107-- broadcast, service, activity or provider.
108CREATE PERFETTO TABLE android_app_process_starts(
109  -- Slice id of the bindApplication slice in the app. Uniquely identifies a process start.
110  start_id LONG,
111  -- Slice id of intent received in the app.
112  id LONG,
113  -- Track id of the intent received in the app.
114  track_id JOINID(track.id),
115  -- Name of the process receiving the intent.
116  process_name STRING,
117  -- Pid of the process receiving the intent.
118  pid LONG,
119  -- Upid of the process receiving the intent.
120  upid JOINID(process.id),
121  -- Intent action or component responsible for the cold start.
122  intent STRING,
123  -- Process start reason: activity, broadcast, service or provider.
124  reason STRING,
125  -- Timestamp the process start was dispatched from system_server.
126  proc_start_ts TIMESTAMP,
127  -- Duration to dispatch the process start from system_server.
128  proc_start_dur DURATION,
129  -- Timestamp the bindApplication started in the app.
130  bind_app_ts TIMESTAMP,
131  -- Duration to complete bindApplication in the app.
132  bind_app_dur DURATION,
133  -- Timestamp the Intent was received in the app.
134  intent_ts TIMESTAMP,
135  -- Duration to handle intent in the app.
136  intent_dur DURATION,
137  -- Total duration from proc_start dispatched to intent completed.
138  total_dur LONG
139) AS
140SELECT
141  bind_app_id AS start_id,
142  id,
143  track_id,
144  process_name,
145  pid,
146  upid,
147  intent,
148  reason,
149  proc_start_ts,
150  proc_start_dur,
151  bind_app_ts,
152  bind_app_dur,
153  intent_ts,
154  intent_dur,
155  total_dur
156FROM _cold_proc_start
157UNION ALL
158SELECT
159  bind_app_id AS start_id,
160  NULL AS id,
161  NULL AS track_id,
162  process_name,
163  pid,
164  upid,
165  NULL AS intent,
166  'provider' AS reason,
167  proc_start_ts,
168  proc_start_dur,
169  ts AS bind_app_ts,
170  dur AS bind_app_dur,
171  NULL AS intent_ts,
172  NULL AS intent_dur,
173  total_dur
174FROM _provider_proc_start;
175