1-- 2-- Copyright 2023 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-- 16 17INCLUDE PERFETTO MODULE android.app_process_starts; 18INCLUDE PERFETTO MODULE android.broadcasts; 19INCLUDE PERFETTO MODULE android.garbage_collection; 20INCLUDE PERFETTO MODULE android.oom_adjuster; 21INCLUDE PERFETTO MODULE android.process_metadata; 22 23DROP VIEW IF EXISTS android_oom_adj_intervals_with_detailed_bucket_name; 24CREATE PERFETTO VIEW android_oom_adj_intervals_with_detailed_bucket_name AS 25SELECT 26 ts, 27 dur, 28 score, 29 android_oom_adj_score_to_detailed_bucket_name(score, android_appid) AS bucket, 30 upid, 31 process_name, 32 oom_adj_id, 33 oom_adj_ts, 34 oom_adj_dur, 35 oom_adj_track_id, 36 oom_adj_thread_name, 37 oom_adj_reason, 38 oom_adj_trigger 39FROM _oom_adjuster_intervals; 40 41CREATE OR REPLACE PERFETTO FUNCTION get_durations(process_name STRING) 42RETURNS TABLE(uint_sleep_dur LONG, total_dur LONG) AS 43SELECT 44 SUM(CASE WHEN thread_state.state="D" then thread_state.dur ELSE 0 END) AS uint_sleep_dur, 45 SUM(thread_state.dur) as total_dur 46FROM android_process_metadata 47INNER JOIN thread ON thread.upid=android_process_metadata.upid 48INNER JOIN thread_state ON thread.utid=thread_state.utid WHERE android_process_metadata.process_name=$process_name; 49 50CREATE OR REPLACE PERFETTO FUNCTION first_user_unlocked() RETURNS INT AS 51SELECT COALESCE(MIN(ts), 0) FROM thread_slice 52WHERE name GLOB "*android.intent.action.USER_UNLOCKED*"; 53 54DROP TABLE IF EXISTS _oom_adj_events_with_src_bucket; 55CREATE PERFETTO TABLE _oom_adj_events_with_src_bucket 56AS 57SELECT 58 LAG(bucket) OVER (PARTITION BY upid ORDER BY ts) AS src_bucket, 59 ts, 60 bucket, 61 process_name, 62 oom_adj_reason 63FROM android_oom_adj_intervals_with_detailed_bucket_name; 64 65DROP VIEW IF EXISTS oom_adj_events_by_process_name; 66CREATE PERFETTO VIEW oom_adj_events_by_process_name AS 67SELECT 68 src_bucket, 69 bucket, 70 count(ts) as count, 71 process_name 72FROM _oom_adj_events_with_src_bucket 73 WHERE ts > first_user_unlocked() 74GROUP BY process_name, bucket, src_bucket; 75 76DROP VIEW IF EXISTS oom_adj_events_global_by_bucket; 77CREATE PERFETTO VIEW oom_adj_events_global_by_bucket AS 78SELECT 79 src_bucket, 80 bucket, 81 count(ts) as count, 82 NULL as name 83FROM _oom_adj_events_with_src_bucket 84WHERE 85 ts > first_user_unlocked() 86GROUP BY bucket, src_bucket; 87 88DROP VIEW IF EXISTS oom_adj_events_by_oom_adj_reason; 89CREATE PERFETTO VIEW oom_adj_events_by_oom_adj_reason AS 90SELECT 91 src_bucket, 92 bucket, 93 count(ts) as count, 94 oom_adj_reason as name 95FROM _oom_adj_events_with_src_bucket 96WHERE ts > first_user_unlocked() 97GROUP BY bucket, src_bucket, oom_adj_reason; 98 99DROP VIEW IF EXISTS android_boot_output; 100CREATE PERFETTO VIEW android_boot_output AS 101SELECT AndroidBootMetric( 102 'system_server_durations', ( 103 SELECT NULL_IF_EMPTY(ProcessStateDurations( 104 'total_dur', total_dur, 105 'uninterruptible_sleep_dur', uint_sleep_dur)) 106 FROM get_durations('system_server')), 107 'systemui_durations', ( 108 SELECT NULL_IF_EMPTY(ProcessStateDurations( 109 'total_dur', total_dur, 110 'uninterruptible_sleep_dur', uint_sleep_dur)) 111 FROM get_durations('com.android.systemui')), 112 'launcher_durations', ( 113 SELECT NULL_IF_EMPTY(ProcessStateDurations( 114 'total_dur', total_dur, 115 'uninterruptible_sleep_dur', uint_sleep_dur)) 116 FROM get_durations('com.google.android.apps.nexuslauncher')), 117 'gms_durations', ( 118 SELECT NULL_IF_EMPTY(ProcessStateDurations( 119 'total_dur', total_dur, 120 'uninterruptible_sleep_dur', uint_sleep_dur)) 121 FROM get_durations('com.google.android.gms.persistent')), 122 'launcher_breakdown', ( 123 SELECT NULL_IF_EMPTY(AndroidBootMetric_LauncherBreakdown( 124 'cold_start_dur', dur)) 125 FROM slice where name="LauncherColdStartup"), 126 'full_trace_process_start_aggregation', ( 127 SELECT NULL_IF_EMPTY(AndroidBootMetric_ProcessStartAggregation( 128 'total_start_sum', (SELECT SUM(total_dur) FROM android_app_process_starts), 129 'num_of_processes', (SELECT COUNT(*) FROM android_app_process_starts), 130 'average_start_time', (SELECT AVG(total_dur) FROM android_app_process_starts))) 131 FROM android_app_process_starts), 132 'post_boot_process_start_aggregation', ( 133 SELECT NULL_IF_EMPTY(AndroidBootMetric_ProcessStartAggregation( 134 'total_start_sum', ( 135 SELECT SUM(total_dur) 136 FROM android_app_process_starts 137 WHERE proc_start_ts > first_user_unlocked() 138 ), 139 'num_of_processes', ( 140 SELECT COUNT(*) 141 FROM android_app_process_starts 142 WHERE proc_start_ts > first_user_unlocked() 143 ), 144 'average_start_time', ( 145 SELECT AVG(total_dur) 146 FROM android_app_process_starts 147 WHERE proc_start_ts > first_user_unlocked() 148 ) 149 )) 150 ), 151 'full_trace_gc_aggregation', ( 152 SELECT NULL_IF_EMPTY(AndroidBootMetric_GarbageCollectionAggregation( 153 'total_gc_count', (SELECT COUNT(*) FROM android_garbage_collection_events 154 ), 155 'num_of_processes_with_gc', (SELECT COUNT(process_name) FROM android_garbage_collection_events 156 ), 157 'num_of_threads_with_gc', ( 158 SELECT SUM(cnt) FROM ( 159 SELECT COUNT(*) AS cnt 160 FROM android_garbage_collection_events 161 GROUP by thread_name, process_name 162 ) 163 ), 164 'avg_gc_duration', (SELECT AVG(gc_dur) FROM android_garbage_collection_events), 165 'avg_running_gc_duration', (SELECT AVG(gc_running_dur) FROM android_garbage_collection_events), 166 'full_gc_count', ( 167 SELECT COUNT(*) 168 FROM android_garbage_collection_events 169 WHERE gc_type = "full" 170 ), 171 'collector_transition_gc_count', ( 172 SELECT COUNT(*) 173 FROM android_garbage_collection_events 174 WHERE gc_type = "collector_transition" 175 ), 176 'young_gc_count', (SELECT COUNT(*) FROM android_garbage_collection_events 177 WHERE gc_type = "young" 178 ), 179 'native_alloc_gc_count', (SELECT COUNT(*) FROM android_garbage_collection_events 180 WHERE gc_type = "native_alloc" 181 ), 182 'explicit_gc_count', (SELECT COUNT(*) FROM android_garbage_collection_events 183 WHERE gc_type = "explicit_gc" 184 ), 185 'alloc_gc_count', (SELECT COUNT(*) FROM android_garbage_collection_events 186 WHERE gc_type = "alloc_gc" 187 ), 188 'mb_per_ms_of_gc', (SELECT SUM(reclaimed_mb)/SUM(gc_running_dur/1e6) AS mb_per_ms_dur 189 FROM android_garbage_collection_events 190 ) 191 )) 192 ), 193 'post_boot_gc_aggregation', ( 194 SELECT NULL_IF_EMPTY(AndroidBootMetric_GarbageCollectionAggregation( 195 'total_gc_count', (SELECT COUNT(*) FROM android_garbage_collection_events 196 WHERE gc_ts > first_user_unlocked() 197 ), 198 'num_of_processes_with_gc', (SELECT COUNT(process_name) FROM android_garbage_collection_events 199 WHERE gc_ts > first_user_unlocked() 200 ), 201 'num_of_threads_with_gc', (SELECT SUM(cnt) FROM (SELECT COUNT(*) AS cnt 202 FROM android_garbage_collection_events 203 WHERE gc_ts > first_user_unlocked() 204 GROUP by thread_name, process_name) 205 ), 206 'avg_gc_duration', (SELECT AVG(gc_dur) FROM android_garbage_collection_events 207 WHERE gc_ts > first_user_unlocked() 208 ), 209 'avg_running_gc_duration', (SELECT AVG(gc_running_dur) FROM android_garbage_collection_events 210 WHERE gc_ts > first_user_unlocked() 211 ), 212 'full_gc_count', (SELECT COUNT(*) FROM android_garbage_collection_events 213 WHERE gc_type = "full" AND gc_ts > first_user_unlocked() 214 ), 215 'collector_transition_gc_count', (SELECT COUNT(*) FROM android_garbage_collection_events 216 WHERE gc_type = "collector_transition" AND gc_ts > ( 217 SELECT COALESCE(MIN(ts), 0) 218 FROM thread_slice 219 WHERE name GLOB "*android.intent.action.USER_UNLOCKED*" 220 ORDER BY ts ASC LIMIT 1 221 ) 222 ), 223 'young_gc_count', ( 224 SELECT COUNT(*) 225 FROM android_garbage_collection_events 226 WHERE gc_type = "young" AND gc_ts > ( 227 SELECT COALESCE(MIN(ts), 0) 228 FROM thread_slice 229 WHERE name GLOB "*android.intent.action.USER_UNLOCKED*" 230 ORDER BY ts ASC LIMIT 1 231 ) 232 ), 233 'native_alloc_gc_count', ( 234 SELECT COUNT(*) 235 FROM android_garbage_collection_events 236 WHERE gc_type = "native_alloc" AND gc_ts > first_user_unlocked() 237 ), 238 'explicit_gc_count', ( 239 SELECT COUNT(*) FROM android_garbage_collection_events 240 WHERE gc_type = "explicit_gc" AND gc_ts > ( 241 SELECT COALESCE(MIN(ts), 0) 242 FROM thread_slice 243 WHERE name GLOB "*android.intent.action.USER_UNLOCKED*" 244 ORDER BY ts ASC LIMIT 1 245 ) 246 ), 247 'alloc_gc_count', ( 248 SELECT COUNT(*) FROM android_garbage_collection_events 249 WHERE gc_type = "alloc_gc" AND gc_ts > first_user_unlocked() 250 ), 251 'mb_per_ms_of_gc', ( 252 SELECT 253 SUM(reclaimed_mb)/SUM(gc_running_dur/1e6) AS mb_per_ms_dur 254 FROM android_garbage_collection_events 255 WHERE gc_ts > first_user_unlocked() 256 ) 257 )) 258 ), 259 'post_boot_oom_adjuster_transition_counts_by_process', ( 260 SELECT RepeatedField( 261 AndroidBootMetric_OomAdjusterTransitionCounts( 262 'name', process_name, 263 'src_bucket', src_bucket, 264 'dest_bucket', bucket, 265 'count', count 266 ) 267 ) FROM oom_adj_events_by_process_name 268 ), 269 'post_boot_oom_adjuster_transition_counts_global', ( 270 SELECT RepeatedField( 271 AndroidBootMetric_OomAdjusterTransitionCounts( 272 'name', name, 273 'src_bucket', src_bucket, 274 'dest_bucket', bucket, 275 'count', count 276 ) 277 ) 278 FROM oom_adj_events_global_by_bucket 279 ), 280 'post_boot_oom_adjuster_transition_counts_by_oom_adj_reason',( 281 SELECT RepeatedField( 282 AndroidBootMetric_OomAdjusterTransitionCounts( 283 'name', name, 284 'src_bucket', src_bucket, 285 'dest_bucket', bucket, 286 'count', count 287 ) 288 ) 289 FROM oom_adj_events_by_oom_adj_reason 290 ), 291 'post_boot_oom_adj_bucket_duration_agg_global',(SELECT RepeatedField( 292 AndroidBootMetric_OomAdjBucketDurationAggregation( 293 'name', name, 294 'bucket', bucket, 295 'total_dur', total_dur 296 )) 297 FROM ( 298 SELECT 299 NULL as name, 300 bucket, 301 SUM(dur) as total_dur 302 FROM android_oom_adj_intervals_with_detailed_bucket_name 303 WHERE ts > first_user_unlocked() 304 GROUP BY bucket) 305 ), 306 'post_boot_oom_adj_bucket_duration_agg_by_process',(SELECT RepeatedField( 307 AndroidBootMetric_OomAdjBucketDurationAggregation( 308 'name', name, 309 'bucket', bucket, 310 'total_dur', total_dur 311 ) 312 ) 313 FROM ( 314 SELECT 315 process_name as name, 316 bucket, 317 SUM(dur) as total_dur 318 FROM android_oom_adj_intervals_with_detailed_bucket_name 319 WHERE ts > first_user_unlocked() 320 AND process_name IS NOT NULL 321 GROUP BY process_name, bucket) 322 ), 323 'post_boot_oom_adj_duration_agg', 324 (SELECT RepeatedField( 325 AndroidBootMetric_OomAdjDurationAggregation( 326 'min_oom_adj_dur', min_oom_adj_dur, 327 'max_oom_adj_dur', max_oom_adj_dur, 328 'avg_oom_adj_dur', avg_oom_adj_dur, 329 'oom_adj_event_count', oom_adj_event_count, 330 'oom_adj_reason', oom_adj_reason 331 ) 332 ) 333 FROM ( 334 SELECT 335 MIN(oom_adj_dur) as min_oom_adj_dur, 336 MAX(oom_adj_dur) as max_oom_adj_dur, 337 AVG(oom_adj_dur) as avg_oom_adj_dur, 338 COUNT(DISTINCT(oom_adj_id)) oom_adj_event_count, 339 oom_adj_reason 340 FROM android_oom_adj_intervals_with_detailed_bucket_name 341 WHERE ts > first_user_unlocked() 342 GROUP BY oom_adj_reason 343 ) 344 ), 345 'post_boot_broadcast_process_count_by_intent', ( 346 SELECT RepeatedField( 347 AndroidBootMetric_BroadcastCountAggregation( 348 'name', intent_action, 349 'count', process_name_counts 350 ) 351 ) 352 FROM ( 353 SELECT 354 intent_action, 355 COUNT(process_name) as process_name_counts 356 FROM _android_broadcasts_minsdk_u 357 WHERE ts > first_user_unlocked() 358 GROUP BY intent_action 359 ) 360 ), 361 'post_boot_broadcast_count_by_process', ( 362 SELECT RepeatedField( 363 AndroidBootMetric_BroadcastCountAggregation( 364 'name', process_name, 365 'count', broadcast_counts 366 ) 367 ) 368 FROM ( 369 SELECT 370 process_name, 371 COUNT(id) as broadcast_counts 372 FROM _android_broadcasts_minsdk_u 373 WHERE ts > first_user_unlocked() 374 GROUP BY process_name 375 ) 376 ), 377 'post_boot_brodcast_duration_agg_by_intent', ( 378 SELECT RepeatedField( 379 AndroidBootMetric_BroadcastDurationAggregation( 380 'name', intent_action, 381 'avg_duration', avg_duration, 382 'max_duration', max_duration, 383 'sum_duration', sum_duration 384 ) 385 ) 386 FROM ( 387 SELECT 388 intent_action, 389 AVG(dur) as avg_duration, 390 SUM(dur) as sum_duration, 391 MAX(dur) as max_duration 392 FROM _android_broadcasts_minsdk_u 393 WHERE ts > first_user_unlocked() 394 GROUP BY intent_action 395 ) 396 ), 'post_boot_brodcast_duration_agg_by_process', ( 397 SELECT RepeatedField( 398 AndroidBootMetric_BroadcastDurationAggregation( 399 'name', process_name, 400 'avg_duration', avg_duration, 401 'max_duration', max_duration, 402 'sum_duration', sum_duration 403 ) 404 ) 405 FROM ( 406 SELECT 407 process_name, 408 AVG(dur) as avg_duration, 409 SUM(dur) as sum_duration, 410 MAX(dur) as max_duration 411 FROM _android_broadcasts_minsdk_u 412 WHERE ts > first_user_unlocked() 413 GROUP BY process_name 414 ) 415 ) 416); 417