blob: fdcc04cee4773de456ace3cdc26c2772f6e4f3d6 [file] [log] [blame]
--
-- Copyright 2022 The Android Open Source Project
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
-- https://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
DROP TABLE IF EXISTS android_jank_cuj_counter;
CREATE TABLE android_jank_cuj_counter AS
WITH cuj_counter_track AS (
SELECT
upid,
track.id AS track_id,
-- extract the CUJ name inside <>
STR_SPLIT(STR_SPLIT(track.name, '>#', 0), '<', 1) AS cuj_name,
-- take the name of the counter after #
STR_SPLIT(track.name, '#', 1) AS counter_name
FROM process_counter_track track
JOIN android_jank_cuj USING (upid)
WHERE track.name GLOB 'J<*>#*'
)
SELECT
ts,
upid,
cuj_name,
counter_name,
CAST(value AS INTEGER) AS value
FROM counter
JOIN cuj_counter_track ON counter.track_id = cuj_counter_track.track_id;
SELECT CREATE_FUNCTION(
'ANDROID_JANK_CUJ_COUNTER_VALUE(cuj_name STRING, counter_name STRING, ts_min INT, ts_max INT)',
'INT',
'
SELECT value
FROM android_jank_cuj_counter
WHERE
cuj_name = $cuj_name
AND counter_name = $counter_name
AND ts >= $ts_min
AND ($ts_max IS NULL OR ts <= $ts_max)
ORDER BY ts ASC LIMIT 1
'
);
DROP TABLE IF EXISTS android_jank_cuj_counter_metrics;
CREATE TABLE android_jank_cuj_counter_metrics AS
-- Order CUJs to get the ts of the next CUJ with the same name.
-- This is to avoid selecting counters logged for the next CUJ in case multiple
-- CUJs happened in a short succession.
WITH cujs_ordered AS (
SELECT
cuj_id,
cuj_name,
upid,
state,
ts_end,
CASE
WHEN process_name GLOB 'com.android.*' THEN ts_end
WHEN process_name = 'com.google.android.apps.nexuslauncher' THEN ts_end
-- Some processes publish counters just before logging the CUJ end
ELSE MAX(ts, ts_end - 4000000)
END AS ts_earliest_allowed_counter,
LEAD(ts_end) OVER (PARTITION BY cuj_name ORDER BY ts_end ASC) AS ts_end_next_cuj
FROM android_jank_cuj
)
SELECT
cuj_id,
cuj_name,
upid,
state,
ANDROID_JANK_CUJ_COUNTER_VALUE(cuj_name, 'totalFrames', ts_earliest_allowed_counter, ts_end_next_cuj) AS total_frames,
ANDROID_JANK_CUJ_COUNTER_VALUE(cuj_name, 'missedFrames', ts_earliest_allowed_counter, ts_end_next_cuj) AS missed_frames,
ANDROID_JANK_CUJ_COUNTER_VALUE(cuj_name, 'missedAppFrames', ts_earliest_allowed_counter, ts_end_next_cuj) AS missed_app_frames,
ANDROID_JANK_CUJ_COUNTER_VALUE(cuj_name, 'missedSfFrames', ts_earliest_allowed_counter, ts_end_next_cuj) AS missed_sf_frames,
ANDROID_JANK_CUJ_COUNTER_VALUE(cuj_name, 'maxSuccessiveMissedFrames', ts_earliest_allowed_counter, ts_end_next_cuj) AS missed_frames_max_successive,
-- convert ms to nanos to align with the unit for `dur` in the other tables
ANDROID_JANK_CUJ_COUNTER_VALUE(cuj_name, 'maxFrameTimeMillis', ts_earliest_allowed_counter, ts_end_next_cuj) * 1000000 AS frame_dur_max
FROM cujs_ordered cuj;