1*6dbdd20aSAndroid Build Coastguard Worker// Copyright (C) 2024 The Android Open Source Project 2*6dbdd20aSAndroid Build Coastguard Worker// 3*6dbdd20aSAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*6dbdd20aSAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*6dbdd20aSAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*6dbdd20aSAndroid Build Coastguard Worker// 7*6dbdd20aSAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*6dbdd20aSAndroid Build Coastguard Worker// 9*6dbdd20aSAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*6dbdd20aSAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*6dbdd20aSAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*6dbdd20aSAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*6dbdd20aSAndroid Build Coastguard Worker// limitations under the License. 14*6dbdd20aSAndroid Build Coastguard Worker 15*6dbdd20aSAndroid Build Coastguard Workerimport {Trace} from './trace'; 16*6dbdd20aSAndroid Build Coastguard Workerimport {App} from './app'; 17*6dbdd20aSAndroid Build Coastguard Worker 18*6dbdd20aSAndroid Build Coastguard Worker/** 19*6dbdd20aSAndroid Build Coastguard Worker * This interface defines the shape of the plugins's class constructor (i.e. the 20*6dbdd20aSAndroid Build Coastguard Worker * the constructor and all static members of the plugin's class. 21*6dbdd20aSAndroid Build Coastguard Worker * 22*6dbdd20aSAndroid Build Coastguard Worker * This class constructor is registered with the core. 23*6dbdd20aSAndroid Build Coastguard Worker * 24*6dbdd20aSAndroid Build Coastguard Worker * On trace load, the core will create a new class instance by calling new on 25*6dbdd20aSAndroid Build Coastguard Worker * this constructor and then call its onTraceLoad() function. 26*6dbdd20aSAndroid Build Coastguard Worker */ 27*6dbdd20aSAndroid Build Coastguard Workerexport interface PerfettoPluginStatic<T extends PerfettoPlugin> { 28*6dbdd20aSAndroid Build Coastguard Worker readonly id: string; 29*6dbdd20aSAndroid Build Coastguard Worker readonly dependencies?: ReadonlyArray<PerfettoPluginStatic<PerfettoPlugin>>; 30*6dbdd20aSAndroid Build Coastguard Worker onActivate?(app: App): void; 31*6dbdd20aSAndroid Build Coastguard Worker metricVisualisations?(): MetricVisualisation[]; 32*6dbdd20aSAndroid Build Coastguard Worker new (trace: Trace): T; 33*6dbdd20aSAndroid Build Coastguard Worker} 34*6dbdd20aSAndroid Build Coastguard Worker 35*6dbdd20aSAndroid Build Coastguard Worker/** 36*6dbdd20aSAndroid Build Coastguard Worker * This interface defines the shape of a plugin's trace-scoped instance, which 37*6dbdd20aSAndroid Build Coastguard Worker * is created from the class constructor above at trace load time. 38*6dbdd20aSAndroid Build Coastguard Worker */ 39*6dbdd20aSAndroid Build Coastguard Workerexport interface PerfettoPlugin { 40*6dbdd20aSAndroid Build Coastguard Worker onTraceLoad?(ctx: Trace): Promise<void>; 41*6dbdd20aSAndroid Build Coastguard Worker} 42*6dbdd20aSAndroid Build Coastguard Worker 43*6dbdd20aSAndroid Build Coastguard Workerexport interface MetricVisualisation { 44*6dbdd20aSAndroid Build Coastguard Worker // The name of the metric e.g. 'android_camera' 45*6dbdd20aSAndroid Build Coastguard Worker metric: string; 46*6dbdd20aSAndroid Build Coastguard Worker 47*6dbdd20aSAndroid Build Coastguard Worker // A vega or vega-lite visualisation spec. 48*6dbdd20aSAndroid Build Coastguard Worker // The data from the metric under path will be exposed as a 49*6dbdd20aSAndroid Build Coastguard Worker // datasource named "metric" in Vega(-Lite) 50*6dbdd20aSAndroid Build Coastguard Worker spec: string; 51*6dbdd20aSAndroid Build Coastguard Worker 52*6dbdd20aSAndroid Build Coastguard Worker // A path index into the metric. 53*6dbdd20aSAndroid Build Coastguard Worker // For example if the metric returns the folowing protobuf: 54*6dbdd20aSAndroid Build Coastguard Worker // { 55*6dbdd20aSAndroid Build Coastguard Worker // foo { 56*6dbdd20aSAndroid Build Coastguard Worker // bar { 57*6dbdd20aSAndroid Build Coastguard Worker // baz: { name: "a" } 58*6dbdd20aSAndroid Build Coastguard Worker // baz: { name: "b" } 59*6dbdd20aSAndroid Build Coastguard Worker // baz: { name: "c" } 60*6dbdd20aSAndroid Build Coastguard Worker // } 61*6dbdd20aSAndroid Build Coastguard Worker // } 62*6dbdd20aSAndroid Build Coastguard Worker // } 63*6dbdd20aSAndroid Build Coastguard Worker // That becomes the following json: 64*6dbdd20aSAndroid Build Coastguard Worker // { "foo": { "bar": { "baz": [ 65*6dbdd20aSAndroid Build Coastguard Worker // {"name": "a"}, 66*6dbdd20aSAndroid Build Coastguard Worker // {"name": "b"}, 67*6dbdd20aSAndroid Build Coastguard Worker // {"name": "c"}, 68*6dbdd20aSAndroid Build Coastguard Worker // ]}}} 69*6dbdd20aSAndroid Build Coastguard Worker // And given path = ["foo", "bar", "baz"] 70*6dbdd20aSAndroid Build Coastguard Worker // We extract: 71*6dbdd20aSAndroid Build Coastguard Worker // [ {"name": "a"}, {"name": "b"}, {"name": "c"} ] 72*6dbdd20aSAndroid Build Coastguard Worker // And pass that to the vega(-lite) visualisation. 73*6dbdd20aSAndroid Build Coastguard Worker path: string[]; 74*6dbdd20aSAndroid Build Coastguard Worker} 75*6dbdd20aSAndroid Build Coastguard Worker 76*6dbdd20aSAndroid Build Coastguard Workerexport interface PluginManager { 77*6dbdd20aSAndroid Build Coastguard Worker getPlugin<T extends PerfettoPlugin>(plugin: PerfettoPluginStatic<T>): T; 78*6dbdd20aSAndroid Build Coastguard Worker metricVisualisations(): MetricVisualisation[]; 79*6dbdd20aSAndroid Build Coastguard Worker} 80