• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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