| // Copyright (C) 2024 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 |
| // |
| // http://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. |
| import {Trace} from '../../../public/trace'; |
| |
| /** |
| * Represents data for a Full trace metric |
| * Eg.- perfetto_ft_launcher-missed_sf_frames-mean |
| * ft here stands for full trace |
| */ |
| export interface FullTraceMetricData { |
| /** Process name (e.g., com.google.android.apps.nexuslauncher) */ |
| process: string; |
| |
| /** Jank type (e.g., app or sf missed frame) */ |
| jankType: JankType; |
| } |
| |
| /** |
| * Represents data for a CUJ scoped metric |
| * Eg.- perfetto_cuj_launcher-RECENTS_SCROLLING-counter_metrics-missed_sf_frames-mean |
| */ |
| export interface CujScopedMetricData { |
| /** Process name (e.g., com.google.android.apps.nexuslauncher) */ |
| process: string; |
| |
| /** Cuj interaction name (e.g., RECENTS_SCROLLING) */ |
| cujName: string; |
| |
| /** Jank type (e.g., app or sf missed frame) */ |
| jankType: JankType; |
| } |
| |
| /** |
| * Represents data for a Blocking Call metric |
| * Eg.- perfetto_android_blocking_call-cuj-name-com.google.android.apps.nexuslauncher-name-TASKBAR_EXPAND-blocking_calls-name-animation-total_dur_ms-mean |
| */ |
| export interface BlockingCallMetricData { |
| /** Process name (e.g., com.google.android.apps.nexuslauncher) */ |
| process: string; |
| |
| /** Cuj interaction name (e.g., TASKBAR_EXPAND) */ |
| cujName: string; |
| |
| /** Blocking Call name (e.g., animation) */ |
| blockingCallName: string; |
| |
| /** aggregation type (e.g., total_dur_ms-mean) */ |
| aggregation: string; |
| } |
| |
| /** Represents a cuj to be pinned. */ |
| export interface CujMetricData { |
| cujName: string; |
| } |
| |
| // Common MetricData for all handler. If new needed then add here. |
| export type MetricData = |
| | FullTraceMetricData |
| | CujScopedMetricData |
| | BlockingCallMetricData |
| | CujMetricData; |
| |
| // Common JankType for cujScoped and fullTrace metrics |
| export type JankType = 'sf_frames' | 'app_frames' | 'frames'; |
| |
| /** |
| * Common interface for debug track handlers |
| */ |
| export interface MetricHandler { |
| /** |
| * Match metric key & return parsed data if successful. |
| * |
| * @param {string} metricKey The metric key to match. |
| * @returns {MetricData | undefined} Parsed data or undefined if no match. |
| */ |
| match(metricKey: string): MetricData | undefined; |
| |
| /** |
| * Add debug track for parsed metric data. |
| * |
| * @param {MetricData} metricData The parsed metric data. |
| * @param {Trace} ctx context for trace methods and properties |
| * @returns {void} |
| */ |
| addMetricTrack(metricData: MetricData, ctx: Trace): void; |
| } |
| |
| // Pair for matching metric and its handler |
| export type MetricHandlerMatch = { |
| metricData: MetricData; |
| metricHandler: MetricHandler; |
| }; |
| |
| /** |
| * Expand process name for specific system processes |
| * |
| * @param {string} metricProcessName Name of the processes |
| * @returns {string} Either the same or expanded name for abbreviated process names |
| */ |
| export function expandProcessName(metricProcessName: string): string { |
| if (metricProcessName.includes('systemui')) { |
| return 'com.android.systemui'; |
| } else if (metricProcessName.includes('launcher')) { |
| return 'com.google.android.apps.nexuslauncher'; |
| } else if (metricProcessName.includes('surfaceflinger')) { |
| return '/system/bin/surfaceflinger'; |
| } else { |
| return metricProcessName; |
| } |
| } |