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