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 16SELECT RUN_METRIC('android/process_metadata.sql'); 17 18DROP VIEW IF EXISTS android_frame_timeline_metric_per_process; 19CREATE VIEW android_frame_timeline_metric_per_process AS 20WITH frames AS ( 21 SELECT 22 process.upid, 23 process.name AS process_name, 24 timeline.name AS vsync, 25 jank_type GLOB '*App Deadline Missed*' AS missed_app_frame, 26 jank_type GLOB '*SurfaceFlinger CPU Deadline Missed*' 27 OR jank_type GLOB '*SurfaceFlinger GPU Deadline Missed*' 28 OR jank_type GLOB '*SurfaceFlinger Scheduling*' 29 OR jank_type GLOB '*Prediction Error*' 30 OR jank_type GLOB '*Display HAL*' AS missed_sf_frame, 31 jank_type GLOB '*App Deadline Missed*' 32 OR jank_type GLOB '*SurfaceFlinger CPU Deadline Missed*' 33 OR jank_type GLOB '*SurfaceFlinger GPU Deadline Missed*' 34 OR jank_type GLOB '*SurfaceFlinger Scheduling*' 35 OR jank_type GLOB '*Prediction Error*' 36 OR jank_type GLOB '*Display HAL*' 37 OR jank_type GLOB '*Dropped Frame*' AS missed_frame, 38 jank_type GLOB '*Dropped Frame*' AS dropped_frame, 39 dur, 40 dur / 1e6 AS dur_ms 41 FROM actual_frame_timeline_slice timeline 42 JOIN process USING (upid)) 43SELECT 44 upid, 45 process_name, 46 process_metadata.metadata AS process_metadata, 47 COUNT(DISTINCT(vsync)) AS total_frames, 48 COUNT(DISTINCT(IIF(missed_app_frame, vsync, NULL))) AS missed_app_frames, 49 COUNT(DISTINCT(IIF(missed_sf_frame, vsync, NULL))) AS missed_sf_frames, 50 COUNT(DISTINCT(IIF(missed_frame, vsync, NULL))) AS missed_frames, 51 COUNT(DISTINCT(IIF(dropped_frame, vsync, NULL))) AS dropped_frames, 52 CAST(PERCENTILE(dur, 50) AS INTEGER) AS frame_dur_p50, 53 CAST(PERCENTILE(dur, 90) AS INTEGER) AS frame_dur_p90, 54 CAST(PERCENTILE(dur, 95) AS INTEGER) AS frame_dur_p95, 55 CAST(PERCENTILE(dur, 99) AS INTEGER) AS frame_dur_p99, 56 PERCENTILE(dur_ms, 50) AS frame_dur_ms_p50, 57 PERCENTILE(dur_ms, 90) AS frame_dur_ms_p90, 58 PERCENTILE(dur_ms, 95) AS frame_dur_ms_p95, 59 PERCENTILE(dur_ms, 99) AS frame_dur_ms_p99, 60 CAST(AVG(dur) AS INTEGER) AS frame_dur_avg, 61 MAX(dur) AS frame_dur_max 62FROM frames 63JOIN process_metadata USING (upid) 64GROUP BY upid, process_name; 65 66DROP VIEW IF EXISTS android_frame_timeline_metric_output; 67CREATE VIEW android_frame_timeline_metric_output 68AS 69SELECT 70 AndroidFrameTimelineMetric( 71 'total_frames', SUM(total_frames), 72 'missed_app_frames', SUM(missed_app_frames), 73 'dropped_frames', SUM(dropped_frames), 74 'process', ( 75 SELECT 76 RepeatedField( 77 AndroidFrameTimelineMetric_ProcessBreakdown( 78 'process', process_metadata, 79 'total_frames', total_frames, 80 'missed_frames', missed_frames, 81 'missed_app_frames', missed_app_frames, 82 'missed_sf_frames', missed_sf_frames, 83 'frame_dur_max', frame_dur_max, 84 'frame_dur_avg', frame_dur_avg, 85 'frame_dur_p50', frame_dur_p50, 86 'frame_dur_p90', frame_dur_p90, 87 'frame_dur_p95', frame_dur_p95, 88 'frame_dur_p99', frame_dur_p99, 89 'frame_dur_ms_p50', frame_dur_ms_p50, 90 'frame_dur_ms_p90', frame_dur_ms_p90, 91 'frame_dur_ms_p95', frame_dur_ms_p95, 92 'frame_dur_ms_p99', frame_dur_ms_p99, 93 'dropped_frames', dropped_frames)) 94 FROM android_frame_timeline_metric_per_process)) 95FROM android_frame_timeline_metric_per_process; 96