• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1--
2-- Copyright 2022 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
16DROP TABLE IF EXISTS android_jank_cuj_counter;
17CREATE TABLE android_jank_cuj_counter AS
18WITH cuj_counter_track AS (
19  SELECT
20    upid,
21    track.id AS track_id,
22    -- extract the CUJ name inside <>
23    STR_SPLIT(STR_SPLIT(track.name, '>#', 0), '<', 1) AS cuj_name,
24    -- take the name of the counter after #
25    STR_SPLIT(track.name, '#', 1) AS counter_name
26  FROM process_counter_track track
27  JOIN android_jank_cuj USING (upid)
28  WHERE track.name GLOB 'J<*>#*'
29)
30SELECT
31  ts,
32  upid,
33  cuj_name,
34  counter_name,
35  CAST(value AS INTEGER) AS value
36FROM counter
37JOIN cuj_counter_track ON counter.track_id = cuj_counter_track.track_id;
38
39SELECT CREATE_FUNCTION(
40  'ANDROID_JANK_CUJ_COUNTER_VALUE(cuj_name STRING, counter_name STRING, ts_min INT, ts_max INT)',
41  'INT',
42  '
43  SELECT value
44  FROM android_jank_cuj_counter
45  WHERE
46    cuj_name = $cuj_name
47    AND counter_name = $counter_name
48    AND ts >= $ts_min
49    AND ($ts_max IS NULL OR ts <= $ts_max)
50  ORDER BY ts ASC LIMIT 1
51  '
52);
53
54DROP TABLE IF EXISTS cuj_marker_missed_callback;
55CREATE TABLE cuj_marker_missed_callback AS
56SELECT
57  marker_track.name AS cuj_slice_name,
58  marker.ts,
59  marker.name AS marker_name
60FROM slice marker
61JOIN track marker_track on  marker_track.id = marker.track_id
62WHERE marker.name GLOB '*FT#Missed*';
63
64SELECT CREATE_FUNCTION(
65   'ANDROID_MISSED_VSYNCS_FOR_CALLBACK(cuj_slice_name STRING, ts_min INT, ts_max INT, callback_missed STRING)',
66   'INT',
67   '
68   SELECT IFNULL(SUM(marker_name GLOB $callback_missed), 0)
69   FROM cuj_marker_missed_callback
70   WHERE
71     cuj_slice_name = $cuj_slice_name
72     AND ts >= $ts_min
73     AND ($ts_max IS NULL OR ts <= $ts_max)
74   ORDER BY ts ASC LIMIT 1
75   '
76);
77
78DROP TABLE IF EXISTS android_jank_cuj_counter_metrics;
79CREATE TABLE android_jank_cuj_counter_metrics AS
80-- Order CUJs to get the ts of the next CUJ with the same name.
81-- This is to avoid selecting counters logged for the next CUJ in case multiple
82-- CUJs happened in a short succession.
83WITH cujs_ordered AS (
84  SELECT
85    cuj_id,
86    cuj_name,
87    cuj_slice_name,
88    upid,
89    state,
90    ts_end,
91    CASE
92      WHEN process_name GLOB 'com.android.*' THEN ts_end
93      WHEN process_name = 'com.google.android.apps.nexuslauncher' THEN ts_end
94      -- Some processes publish counters just before logging the CUJ end
95      ELSE MAX(ts, ts_end - 4000000)
96    END AS ts_earliest_allowed_counter,
97    LEAD(ts_end) OVER (PARTITION BY cuj_name ORDER BY ts_end ASC) AS ts_end_next_cuj
98  FROM android_jank_cuj
99)
100SELECT
101  cuj_id,
102  cuj_name,
103  upid,
104  state,
105  ANDROID_JANK_CUJ_COUNTER_VALUE(cuj_name, 'totalFrames', ts_earliest_allowed_counter, ts_end_next_cuj) AS total_frames,
106  ANDROID_JANK_CUJ_COUNTER_VALUE(cuj_name, 'missedFrames', ts_earliest_allowed_counter, ts_end_next_cuj) AS missed_frames,
107  ANDROID_JANK_CUJ_COUNTER_VALUE(cuj_name, 'missedAppFrames', ts_earliest_allowed_counter, ts_end_next_cuj) AS missed_app_frames,
108  ANDROID_JANK_CUJ_COUNTER_VALUE(cuj_name, 'missedSfFrames', ts_earliest_allowed_counter, ts_end_next_cuj) AS missed_sf_frames,
109  ANDROID_JANK_CUJ_COUNTER_VALUE(cuj_name, 'maxSuccessiveMissedFrames', ts_earliest_allowed_counter, ts_end_next_cuj) AS missed_frames_max_successive,
110  -- convert ms to nanos to align with the unit for `dur` in the other tables
111  ANDROID_JANK_CUJ_COUNTER_VALUE(cuj_name, 'maxFrameTimeMillis', ts_earliest_allowed_counter, ts_end_next_cuj) * 1000000 AS frame_dur_max,
112  ANDROID_MISSED_VSYNCS_FOR_CALLBACK(cuj_slice_name, ts_earliest_allowed_counter, ts_end_next_cuj, '*SF*') AS sf_callback_missed_frames,
113  ANDROID_MISSED_VSYNCS_FOR_CALLBACK(cuj_slice_name, ts_earliest_allowed_counter, ts_end_next_cuj, '*HWUI*') AS hwui_callback_missed_frames
114FROM cujs_ordered cuj;
115