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