blob: 588cd050cb08a308b7bcc35de7a88b9d02ec3901 [file] [log] [blame]
// AUTOGENERATED - DO NOT EDIT
// ---------------------------
// This file has been generated by
// AOSP://external/perfetto/tools/gen_merged_protos
// merging the perfetto config protos.
// This fused proto is intended to be copied in:
// - Android tree, for statsd.
// - Google internal repos.
syntax = "proto2";
package perfetto.protos;
option go_package = "github.com/google/perfetto/perfetto_proto";
// Begin of protos/perfetto/metrics/android/android_blocking_call.proto
// Blocking call on the main thread.
message AndroidBlockingCall {
// Name of the blocking call
optional string name = 1;
// Number of times it happened within the CUJ
optional int64 cnt = 2;
// Total duration within the CUJ
optional int64 total_dur_ms = 3;
// Maximal duration within the CUJ
optional int64 max_dur_ms = 4;
// Minimal duration within the CUJ
optional int64 min_dur_ms = 5;
// Total duration within the CUJ in nanoseconds
optional int64 total_dur_ns = 6;
// Maximal duration within the CUJ in nanoseconds
optional int64 max_dur_ns = 7;
// Minimal duration within the CUJ in nanoseconds
optional int64 min_dur_ns = 8;
}
// End of protos/perfetto/metrics/android/android_blocking_call.proto
// Begin of protos/perfetto/metrics/android/process_metadata.proto
message AndroidProcessMetadata {
// Process name. Usually, cmdline or <package_name>(:<custom_name>)?.
optional string name = 1;
// User id under which this process runs.
optional int64 uid = 2;
// Package metadata from Android package list.
message Package {
optional string package_name = 1;
optional int64 apk_version_code = 2;
optional bool debuggable = 3;
}
// Package that this process belongs to.
//
// If this process shares its uid (see `packages_for_uid` field), the package
// is determined based on the process name and package name. If there is no
// match this field is empty.
optional Package package = 7;
// All packages using this uid.
//
// Shared uid documentation:
// https://developer.android.com/guide/topics/manifest/manifest-element#uid
repeated Package packages_for_uid = 8;
// Pid of the process name.
optional int64 pid = 9;
reserved 3, 4, 5, 6;
}
// End of protos/perfetto/metrics/android/process_metadata.proto
// Begin of protos/perfetto/metrics/android/android_blocking_calls_cuj_metric.proto
// Blocking calls inside Android CUJs. Shows count and total duration for each.
message AndroidBlockingCallsCujMetric {
repeated Cuj cuj = 1;
// Next id: 7
message Cuj {
// ID of the CUJ that is unique within the trace.
optional int32 id = 1;
// Name of the CUJ, extracted from the CUJ jank or latency trace marker.
// For example SHADE_EXPAND_COLLAPSE from J<SHADE_EXPAND_COLLAPSE>.
optional string name = 2;
// Details about the process (uid, version, etc)
optional AndroidProcessMetadata process = 3;
// ts of the CUJ trace marker slice, in ns.
optional int64 ts = 4;
// dur of the CUJ trace marker slice, in ns.
optional int64 dur = 5;
// List of blocking calls on the process main thread.
repeated AndroidBlockingCall blocking_calls = 6;
}
}
// End of protos/perfetto/metrics/android/android_blocking_calls_cuj_metric.proto
// Begin of protos/perfetto/metrics/android/android_frame_timeline_metric.proto
message AndroidFrameTimelineMetric {
message JankTypeMetric {
// The jank type
optional string type = 1;
// The count of frames with this jank type
optional int64 total_count = 2;
// The count of frames with this jank type and present type = PRESENT_UNSPECIFIED
optional int64 present_unspecified_count = 3;
// The count of frames with this jank type and present type = PRESENT_ON_TIME
optional int64 present_on_time_count = 4;
// The count of frames with this jank type and present type = PRESENT_LATE
optional int64 present_late_count = 5;
// The count of frames with this jank type and present type = PRESENT_EARLY
optional int64 present_early_count = 6;
// The count of frames with this jank type and present type = PRESENT_DROPPED
optional int64 present_dropped_count = 7;
// The count of frames with this jank type and present type = PRESENT_UNKNOWN
optional int64 present_unknown_count = 8;
}
message ProcessBreakdown {
optional AndroidProcessMetadata process = 3;
optional int64 total_frames = 4;
optional int64 missed_frames = 5;
optional int64 missed_app_frames = 6;
optional int64 missed_sf_frames = 7;
optional int64 frame_dur_max = 8;
optional int64 frame_dur_avg = 9;
optional int64 frame_dur_p50 = 10;
optional int64 frame_dur_p90 = 11;
optional int64 frame_dur_p95 = 12;
optional int64 frame_dur_p99 = 13;
optional double frame_dur_ms_p50 = 14;
optional double frame_dur_ms_p90 = 15;
optional double frame_dur_ms_p95 = 16;
optional double frame_dur_ms_p99 = 17;
optional int64 dropped_frames = 18;
// Metrics for each jank type in this process
repeated JankTypeMetric jank_types = 19;
reserved 1, 2;
}
optional int64 total_frames = 4;
optional int64 missed_app_frames = 5;
optional int64 dropped_frames = 6;
repeated ProcessBreakdown process = 2;
// Metrics for each jank type globally
repeated JankTypeMetric jank_types = 7;
reserved 1;
}
// End of protos/perfetto/metrics/android/android_frame_timeline_metric.proto
// Begin of protos/perfetto/metrics/android/android_sysui_notifications_blocking_calls_metric.proto
// Blocking calls inside System UI Notifications. Shows count and total duration for each.
message AndroidSysUINotificationsBlockingCallsMetric {
repeated AndroidBlockingCall blocking_calls = 1;
}
// End of protos/perfetto/metrics/android/android_sysui_notifications_blocking_calls_metric.proto
// Begin of protos/perfetto/metrics/android/android_trusty_workqueues.proto
// Metric used to generate a simplified view of the Trusty kworker events.
message AndroidTrustyWorkqueues {}
// End of protos/perfetto/metrics/android/android_trusty_workqueues.proto
// Begin of protos/perfetto/metrics/android/anr_metric.proto
message AndroidAnrMetric {
repeated Anr anr = 1;
// Next id: 12
message Anr {
// UUID that identifies the ANR.
optional string error_id = 1;
// Name of the process that ANRed.
optional string process_name = 2;
// PID of the ANRing process.
optional int32 pid = 3;
// ANR subject line.
optional string subject = 4;
// Timestamp of the ANR in the trace.
optional int64 ts = 5;
}
}
// End of protos/perfetto/metrics/android/anr_metric.proto
// Begin of protos/perfetto/metrics/android/batt_metric.proto
message AndroidBatteryMetric {
message BatteryCounters {
// Timestamp measured from boot time [ns].
optional int64 timestamp_ns = 1;
// Fields 2-5 are the same as in BatteryCounters proto in TracePacket.
optional double charge_counter_uah = 2;
optional float capacity_percent = 3;
optional double current_ua = 4;
optional double current_avg_ua = 5;
}
message BatteryAggregates {
// Field numbers for these 3 == the int values from Android
optional int64 total_screen_off_ns = 1;
optional int64 total_screen_on_ns = 2;
optional int64 total_screen_doze_ns = 3;
// Total time a wakelock was held
optional int64 total_wakelock_ns = 4;
// Amount of time the device was suspended. Depends on the ftrace source
// "power/suspend_resume".
optional int64 sleep_ns = 5;
optional int64 sleep_screen_off_ns = 6;
optional int64 sleep_screen_on_ns = 7;
optional int64 sleep_screen_doze_ns = 8;
}
// Period of time during the trace that the device went to sleep completely.
message SuspendPeriod {
optional int64 timestamp_ns = 1;
optional int64 duration_ns = 2;
}
// Battery counters info for each ts of the trace. This should only be
// extracted for short traces.
repeated BatteryCounters battery_counters = 1;
optional BatteryAggregates battery_aggregates = 2;
repeated SuspendPeriod suspend_period = 3;
}
// End of protos/perfetto/metrics/android/batt_metric.proto
// Begin of protos/perfetto/metrics/android/binder_metric.proto
// This metric provides the following:
// 1. Per-process Binder statistics for traces with binder_driver enabled.
// Specifically, transactions are categorized and counted
// 2. Unaggregated binder txn durations with per-txn aggregated thread state and
// blocked function
// durations
message AndroidBinderMetric {
message PerProcessBreakdown {
optional string process_name = 1;
optional uint32 pid = 2;
optional string slice_name = 3;
optional uint32 count = 4;
}
// Next field id: 22
message UnaggregatedTxnBreakdown {
// General
optional string aidl_name = 1;
optional bool is_sync = 21;
// Client
// Removed: was binder_txn_id
reserved 2;
optional string client_process = 3;
optional string client_thread = 4;
optional bool is_main_thread = 5;
optional int64 client_ts = 6;
optional int64 client_dur = 7;
optional int64 client_oom_score = 19;
// Server
// Removed: was binder_reply_id
reserved 8;
optional string server_process = 9;
optional string server_thread = 10;
optional int64 server_ts = 11;
optional int64 server_dur = 12;
optional int64 server_oom_score = 20;
// Aggregations
repeated ThreadStateBreakdown thread_states = 13;
repeated BlockedFunctionBreakdown blocked_functions = 14;
optional uint32 client_tid = 15;
optional uint32 server_tid = 16;
optional uint32 client_pid = 17;
optional uint32 server_pid = 18;
}
message ThreadStateBreakdown {
optional string thread_state_type = 1;
optional string thread_state = 2;
optional int64 thread_state_dur = 3;
optional int64 thread_state_count = 4;
}
message BlockedFunctionBreakdown {
optional string thread_state_type = 1;
optional string blocked_function = 2;
optional int64 blocked_function_dur = 3;
optional int64 blocked_function_count = 4;
}
repeated PerProcessBreakdown process_breakdown = 1;
repeated UnaggregatedTxnBreakdown unaggregated_txn_breakdown = 2;
}
// End of protos/perfetto/metrics/android/binder_metric.proto
// Begin of protos/perfetto/metrics/android/camera_metric.proto
message AndroidCameraMetric {
message Counter {
optional double min = 1;
optional double max = 2;
optional double avg = 3;
}
// Counter for the sum of DMA and RSS across GCA, cameraserver
// and HAL. This provides a single number for the memory
// pressure using the camera is putting on the rest of the
// system.
//
// Note: this number assumes that all DMA pressure is coming
// from the camera as this is usually a pretty good
// approximation. Being more accurate here would increase the
// complexity of the metric significantly.
//
// Note: if there are multiple GCA/cameraserver/HAL processes
// in the trace, this metric will simply take the latest
// one in the trace and ignore the others.
optional Counter gc_rss_and_dma = 1;
}
// End of protos/perfetto/metrics/android/camera_metric.proto
// Begin of protos/perfetto/metrics/android/camera_unagg_metric.proto
message AndroidCameraUnaggregatedMetric {
message Value {
optional int64 ts = 1;
optional double gca_rss_val = 2;
optional double hal_rss_val = 3;
optional double cameraserver_rss_val = 4;
optional double dma_val = 5;
optional double value = 6;
}
// Timeseries for the sum of DMA and RSS across GCA, cameraserver
// and HAL. This provides a single number for the memory
// pressure using the camera is putting on the rest of the
// system.
//
// Note: this number assumes that all DMA pressure is coming
// from the camera as this is usually a pretty good
// approximation. Being more accurate here would increase the
// complexity of the metric significantly.
//
// Note: if there are multiple GCA/cameraserver/HAL processes
// in the trace, this metric will simply take the latest
// one in the trace and ignore the others.
repeated Value gc_rss_and_dma = 1;
}
// End of protos/perfetto/metrics/android/camera_unagg_metric.proto
// Begin of protos/perfetto/metrics/android/cpu_metric.proto
message AndroidCpuMetric {
// Next id: 6
message Metrics {
// CPU megacycles (i.e. cycles divided by 1e6).
optional int64 mcycles = 1;
// Total time the thread was running for this breakdown in
// nanoseconds.
optional int64 runtime_ns = 2;
// Min/max/average CPU frequency weighted by the time the CPU was
// running at each frequency in this breakdown.
optional int64 min_freq_khz = 3;
optional int64 max_freq_khz = 4;
optional int64 avg_freq_khz = 5;
}
// Next id: 7
message CoreData {
optional uint32 id = 1;
optional Metrics metrics = 6;
reserved 2 to 5;
}
// Next id: 3
message CoreTypeData {
optional string type = 1;
optional Metrics metrics = 2;
}
// Next id: 7
message Thread {
optional string name = 1;
optional Metrics metrics = 4;
// Breakdowns of above metrics.
repeated CoreData core = 2;
repeated CoreTypeData core_type = 5;
reserved 3;
}
// Next id: 8
message Process {
optional string name = 1;
optional AndroidProcessMetadata process = 8;
optional Metrics metrics = 4;
// Breakdowns of above metrics.
repeated Thread threads = 6;
repeated CoreData core = 7;
repeated CoreTypeData core_type = 5;
reserved 3;
}
repeated Process process_info = 1;
}
// End of protos/perfetto/metrics/android/cpu_metric.proto
// Begin of protos/perfetto/metrics/android/codec_metrics.proto
// These metrices collects various function and thread
// usage within androd's codec framework. This can give an
// idea about performance and cpu usage when using codec
// framework
message AndroidCodecMetrics {
// profile details in messages
message Detail {
// function thread
optional string thread_name = 1;
// total time
optional int64 total_cpu_ns = 2;
// CPU time ( time 'Running' on cpu)
optional int64 running_cpu_ns = 3;
}
// These are traces and could indicate framework queue latency
// buffer-packing, buffer-preprocess, buffer post-process
// latency etc. These metrics are monitored to track quality.
// Same message can come from different
// processes.
message CodecFunction {
// codec string
optional string codec_string = 1;
// process_name
optional string process_name = 2;
// details
optional Detail detail = 3;
}
// This message can indicate overall cpu
// utilization of codec framework threads.
message CpuUsage {
// name of process using codec framework
optional string process_name = 1;
// name of the codec thread
optional string thread_name = 2;
// was thread_cpu_us
reserved 3;
// total cpu usage of the codec thread
optional int64 thread_cpu_ns = 6;
// can be number of codec framework thread
optional uint32 num_threads = 4;
// core type data info used by codec thread
repeated AndroidCpuMetric.CoreTypeData core_data = 5;
}
repeated CpuUsage cpu_usage = 1;
repeated CodecFunction codec_function = 2;
}
// End of protos/perfetto/metrics/android/codec_metrics.proto
// Begin of protos/perfetto/metrics/android/display_metrics.proto
message AndroidDisplayMetrics {
// Stat that reports the number of duplicate frames submitted
// to the display for rendering. That is frames that have the same
// pixels values but where still submitted. It is tracked based on
// comparing the MISR of the current frame vs previous frame.
optional uint32 total_duplicate_frames = 1;
// Stat reports whether there is any duplicate_frames tracked
optional uint32 duplicate_frames_logged = 2;
// Stat that reports the number of dpu underrrun occurs count.
optional uint32 total_dpu_underrun_count = 3;
message RefreshRateStat {
// The refresh rate value (the number of frames per second)
optional uint32 refresh_rate_fps = 1;
// Calculate the number of refresh rate switches to this fps
optional uint32 count = 2;
// Calculate the total duration of refresh rate stays at this fps
optional double total_dur_ms = 3;
// Calculate the average duration of refresh rate stays at this fps
optional double avg_dur_ms = 4;
}
// Calculate the total number of refresh rate changes
optional uint32 refresh_rate_switches = 4;
// The statistics for each refresh rate value
repeated RefreshRateStat refresh_rate_stats = 5;
// Stats to measure the runtime of updating the power state in
// DisplayPowerController
message UpdatePowerState {
optional uint32 avg_runtime_micro_secs = 2;
// Removed: avg_runtime_ms
reserved 1;
}
optional UpdatePowerState update_power_state = 6;
}
// End of protos/perfetto/metrics/android/display_metrics.proto
// Begin of protos/perfetto/metrics/android/dma_heap_metric.proto
// dma-buf heap memory stats on Android.
message AndroidDmaHeapMetric {
optional double avg_size_bytes = 1;
optional double min_size_bytes = 2;
optional double max_size_bytes = 3;
// Total allocation size.
// Essentially the sum of positive allocs.
optional double total_alloc_size_bytes = 4;
}
// End of protos/perfetto/metrics/android/dma_heap_metric.proto
// Begin of protos/perfetto/metrics/android/dvfs_metric.proto
message AndroidDvfsMetric {
message BandStat {
// Operating frequency
optional int32 freq_value = 1;
// Percentage of duration in this operating frequency compared to all frequencies
optional double percentage = 2;
// Total duration in ns when the state was in this operating frequency
optional int64 duration_ns = 3;
}
message FrequencyResidency {
// Frequency representative name
optional string freq_name = 1;
// Each band statistics meta
repeated BandStat band_stat = 2;
}
// Frequency residency metrics from clock_set_rate ftrace event.
repeated FrequencyResidency freq_residencies = 1;
}
// End of protos/perfetto/metrics/android/dvfs_metric.proto
// Begin of protos/perfetto/metrics/android/fastrpc_metric.proto
// fastrpc memory stats on Android.
message AndroidFastrpcMetric {
message Subsystem {
optional string name = 1;
optional double avg_size_bytes = 2;
optional double min_size_bytes = 3;
optional double max_size_bytes = 4;
// Total allocation size.
// Essentially the sum of positive allocs.
optional double total_alloc_size_bytes = 5;
}
repeated Subsystem subsystem = 1;
}
// End of protos/perfetto/metrics/android/fastrpc_metric.proto
// Begin of protos/perfetto/metrics/android/g2d_metric.proto
message G2dMetrics {
message G2dInstance {
// G2d name.
optional string name = 1;
optional uint32 frame_count = 5;
optional uint32 error_count = 6;
optional double max_dur_ms = 7;
optional double min_dur_ms = 8;
optional double avg_dur_ms = 9;
// Removed: was int64 versions of max_dur_ns, min_dur_ns and avg_dur_ns.
reserved 2 to 4;
}
message G2dMetric {
// G2D Metric for each G2D Instance.
repeated G2dInstance instances = 1;
// the number of frames processed by G2D
optional uint32 frame_count = 5;
// the number of error events
optional uint32 error_count = 6;
// max/min/avg G2d frame durations for all instances.
optional double max_dur_ms = 7;
optional double min_dur_ms = 8;
optional double avg_dur_ms = 9;
// Removed: was int64 versions of max_dur_ns, min_dur_ns and avg_dur_ns.
reserved 2 to 4;
}
optional G2dMetric g2d_hw = 1;
optional G2dMetric g2d_sw = 2;
}
// End of protos/perfetto/metrics/android/g2d_metric.proto
// Begin of protos/perfetto/metrics/android/gpu_metric.proto
message AndroidGpuMetric {
message Process {
// Process name.
optional string name = 1;
// max/min/avg GPU memory used by this process.
optional int64 mem_max = 2;
optional int64 mem_min = 3;
optional int64 mem_avg = 4;
}
// GPU metric for processes using GPU.
repeated Process processes = 1;
// max/min/avg GPU memory used by the entire system.
optional int64 mem_max = 2;
optional int64 mem_min = 3;
optional int64 mem_avg = 4;
message FrequencyMetric {
// Identifier for GPU in a multi-gpu device.
optional uint32 gpu_id = 1;
// max/min/avg GPU frequency for this gpu_id
// the calculation of avg is weighted by the duration of each frequency
optional int64 freq_max = 2;
optional int64 freq_min = 3;
optional double freq_avg = 4;
message MetricsPerFrequency {
// Used frequency
optional int64 freq = 1;
// Total duration in ms when the state of GPU was in this frequency
optional double dur_ms = 2;
// Percentage of duration in this frequency compared to all frequencies
// in this gpu_id
optional double percentage = 3;
}
// Metrics for each used GPU frequency
repeated MetricsPerFrequency used_freqs = 5;
}
// GPU frequency metric for each gpu_id
repeated FrequencyMetric freq_metrics = 5;
}
// End of protos/perfetto/metrics/android/gpu_metric.proto
// Begin of protos/perfetto/metrics/android/hwcomposer.proto
message AndroidHwcomposerMetrics {
// Counts the number of composition total layers in the trace. (non-weighted average)
optional double composition_total_layers = 1;
// Counts the number of composition dpu layers in the trace. (non-weighted average)
optional double composition_dpu_layers = 2;
// Counts the number of composition gpu layers in the trace. (non-weighted average)
optional double composition_gpu_layers = 3;
// Counts the number of composition dpu cached layers in the trace. (non-weighted average)
optional double composition_dpu_cached_layers = 4;
// Counts the number of composition surfaceflinger cached layers in the trace.
// (non-weighted average)
optional double composition_sf_cached_layers = 5;
// Counts the number of composition rounded corner decoration layers in the trace.
// (non-weighted average)
optional double composition_rcd_layers = 15;
// Counts how many times validateDisplay is skipped.
optional int32 skipped_validation_count = 6;
// Counts how many times validateDisplay cannot be skipped.
optional int32 unskipped_validation_count = 7;
// Counts how many times validateDisplay is already separated from presentDisplay
// since the beginning.
optional int32 separated_validation_count = 8;
// Counts how many unhandled validation cases which might be caused by errors.
optional int32 unknown_validation_count = 9;
// the average of overall hwcomposer execution time.
optional double avg_all_execution_time_ms = 10;
// the average of hwcomposer execution time for skipped validation cases.
optional double avg_skipped_execution_time_ms = 11;
// the average of hwcomposer execution time for unskipped validation cases.
optional double avg_unskipped_execution_time_ms = 12;
// the average of hwcomposer execution time for separated validation cases.
optional double avg_separated_execution_time_ms = 13;
message DpuVoteMetrics {
// the thread ID that handles this track
optional uint32 tid = 1;
// the weighted average of DPU Vote Clock
optional double avg_dpu_vote_clock = 2;
// the weighted average of DPU Vote Avg Bandwidth
optional double avg_dpu_vote_avg_bw = 3;
// the weighted average of DPU Vote Peak Bandwidth
optional double avg_dpu_vote_peak_bw = 4;
// the weighted average of DPU Vote RT (Real Time) Bandwidth
optional double avg_dpu_vote_rt_bw = 5;
}
// DPU Vote Metrics for each thread track
repeated DpuVoteMetrics dpu_vote_metrics = 14;
message MetricsPerDisplay {
// Display ID in HWC
optional string display_id = 1;
// Counts the number of composition total layers in the trace. (non-weighted average)
optional double composition_total_layers = 2;
// Counts the number of composition dpu layers in the trace. (non-weighted average)
optional double composition_dpu_layers = 3;
// Counts the number of composition gpu layers in the trace. (non-weighted average)
optional double composition_gpu_layers = 4;
// Counts the number of composition dpu cached layers in the trace. (non-weighted average)
optional double composition_dpu_cached_layers = 5;
// Counts the number of composition surfaceflinger cached layers in the trace.
// (non-weighted average)
optional double composition_sf_cached_layers = 6;
// Counts the number of composition rounded corner decoration layers in the trace.
// (non-weighted average)
optional double composition_rcd_layers = 7;
// Counts how many times validateDisplay is skipped.
optional int32 skipped_validation_count = 8;
// Counts how many times validateDisplay cannot be skipped.
optional int32 unskipped_validation_count = 9;
// Counts how many times validateDisplay is already separated from presentDisplay
// since the beginning.
optional int32 separated_validation_count = 10;
// Counts how many unhandled validation cases which might be caused by errors.
optional int32 unknown_validation_count = 11;
// the average of overall hwcomposer execution time.
optional double avg_all_execution_time_ms = 12;
// the average of hwcomposer execution time for skipped validation cases.
optional double avg_skipped_execution_time_ms = 13;
// the average of hwcomposer execution time for unskipped validation cases.
optional double avg_unskipped_execution_time_ms = 14;
// the average of hwcomposer execution time for separated validation cases.
optional double avg_separated_execution_time_ms = 15;
}
repeated MetricsPerDisplay metrics_per_display = 16;
}
// End of protos/perfetto/metrics/android/hwcomposer.proto
// Begin of protos/perfetto/metrics/android/hwui_metric.proto
// Android HWUI graphics performance and graphics memory usage metrics.
message ProcessRenderInfo {
// Name of the package launched
optional string process_name = 1;
// CPU time spent on RenderThread in milliseconds.
optional int64 rt_cpu_time_ms = 2;
// Number of frames drawn on RenderThread, followed by max/min/avg CPU time to draw a frame
// in nanoseconds.
optional uint32 draw_frame_count = 3;
optional int64 draw_frame_max = 4;
optional int64 draw_frame_min = 5;
optional double draw_frame_avg = 6;
// Number of GPU commands flushes and max/min/avg time per flush in nanoseconds.
optional uint32 flush_count = 7;
optional int64 flush_max = 8;
optional int64 flush_min = 9;
optional double flush_avg = 10;
// Number of View tree preparation counts and max/min/avg time to traverse the tree in
// nanoseconds.
optional uint32 prepare_tree_count = 11;
optional int64 prepare_tree_max = 12;
optional int64 prepare_tree_min = 13;
optional double prepare_tree_avg = 14;
// Number of times the GPU rendered a frame and max/min/avg time for GPU to finish rendering in
// in nanoseconds.
optional uint32 gpu_completion_count = 15;
optional int64 gpu_completion_max = 16;
optional int64 gpu_completion_min = 17;
optional double gpu_completion_avg = 18;
// Number of times a frame was recorded/serialized in a display list on the UI thread with
// max/min/avg time in nanoseconds.
optional uint32 ui_record_count = 19;
optional int64 ui_record_max = 20;
optional int64 ui_record_min = 21;
optional double ui_record_avg = 22;
// number of unique shader programs that were used to render frames, followed by total and average
// times to prepare a shader in nanoseconds.
optional uint32 shader_compile_count = 23;
optional int64 shader_compile_time = 24;
optional double shader_compile_avg = 25;
// number of shader programs loaded from the disk cache, followed by total time and average time
// to prepare a shader in nanoseconds.
optional uint32 cache_hit_count = 26;
optional int64 cache_hit_time = 27;
optional double cache_hit_avg = 28;
// number of shader programs compiled/linked, followed by total time and average time to prepare
// a shader in nanoseconds.
optional uint32 cache_miss_count = 29;
optional int64 cache_miss_time = 30;
optional double cache_miss_avg = 31;
// max/min/avg CPU memory used for graphics by HWUI at the end of a frame.
optional int64 graphics_cpu_mem_max = 32;
optional int64 graphics_cpu_mem_min = 33;
optional double graphics_cpu_mem_avg = 34;
// max/min/avg GPU memory used by HWUI at the end of a frame excluding textures.
optional int64 graphics_gpu_mem_max = 35;
optional int64 graphics_gpu_mem_min = 36;
optional double graphics_gpu_mem_avg = 37;
// max/min/avg memory used for GPU textures by HWUI at the end of a frame.
optional int64 texture_mem_max = 38;
optional int64 texture_mem_min = 39;
optional double texture_mem_avg = 40;
// max/min/avg memory used by HWUI at the end of a frame. This is a sum of previous 3 categories.
optional int64 all_mem_max = 41;
optional int64 all_mem_min = 42;
optional double all_mem_avg = 43;
}
message AndroidHwuiMetric {
// HWUI metrics for processes that have a RenderThread.
repeated ProcessRenderInfo process_info = 1;
}
// End of protos/perfetto/metrics/android/hwui_metric.proto
// Begin of protos/perfetto/metrics/android/io_metric.proto
// Measure Android IO stats in a trace.
// Note: This is an aggregated metric, for unaggregated metrics look at AndroidIoUnaggregated
// in io_unagg_metric.proto.
message AndroidIo {
// Next id: 3
// Stats for Counters in an f2fs file system.
// Counters are available for various operations.
message F2fsCounterStats {
optional string name = 1;
optional double max = 2;
optional double sum = 3;
optional double min = 5;
optional int64 dur = 6;
optional int64 count = 7;
optional double avg = 8;
}
// Aggregated stats for write operations in an f2fs file system.
message F2fsWriteStats {
optional int64 total_write_count = 1;
optional int64 distinct_processes = 2;
optional int64 total_bytes_written = 3;
optional int64 distinct_device_count = 4;
optional int64 distict_inode_count = 5;
optional int64 distinct_thread_count = 6;
}
repeated F2fsCounterStats f2fs_counter_stats = 1;
repeated F2fsWriteStats f2fs_write_stats = 2;
}
// End of protos/perfetto/metrics/android/io_metric.proto
// Begin of protos/perfetto/metrics/android/io_unagg_metric.proto
// IO metrics on Android in unaggregated form.
// Note: this generates a lot of data so should not be requested unless it
// is clear that this data is necessary.
message AndroidIoUnaggregated {
// Next id: 2
message F2fsWriteUnaggreagatedStat {
optional uint32 tid = 1;
optional string thread_name = 2;
optional uint32 pid = 3;
optional string process_name = 4;
optional int64 ino = 5;
optional int64 dev = 6;
}
// F2fs write stats which are grouped by thread and inode.
repeated F2fsWriteUnaggreagatedStat f2fs_write_unaggregated_stats = 1;
}
// End of protos/perfetto/metrics/android/io_unagg_metric.proto
// Begin of protos/perfetto/metrics/android/ion_metric.proto
// ion memory stats on Android.
message AndroidIonMetric {
message Buffer {
optional string name = 1;
optional double avg_size_bytes = 2;
optional double min_size_bytes = 3;
optional double max_size_bytes = 4;
// Total allocation size.
// Essentially the sum of positive allocs (-> new buffers).
optional double total_alloc_size_bytes = 5;
}
repeated Buffer buffer = 1;
}
// End of protos/perfetto/metrics/android/ion_metric.proto
// Begin of protos/perfetto/metrics/android/irq_runtime_metric.proto
// measure max IRQ runtime and IRQ tasks running over threshold.
message AndroidIrqRuntimeMetric {
message IrqSlice {
// IRQ name
optional string irq_name = 1;
// timestamp
optional int64 ts = 2;
// runtime of IRQ task
optional int64 dur = 3;
}
message ThresholdMetric {
// Threshold value
optional string threshold = 1;
// over threshold count
optional int64 over_threshold_count = 2;
// anomaly ratio (over threshold count / total count)
optional double anomaly_ratio= 3;
}
message IrqRuntimeMetric {
// max runtime of IRQ tasks
optional int64 max_runtime = 1;
// total IRQ tasks
optional int64 total_count = 2;
// over threshold metric
optional ThresholdMetric threshold_metric = 3;
// information for top 10 IRQ tasks
repeated IrqSlice longest_irq_slices = 4;
}
// metrics for hardirq and softirq
optional IrqRuntimeMetric hw_irq = 1;
optional IrqRuntimeMetric sw_irq = 2;
}
// End of protos/perfetto/metrics/android/irq_runtime_metric.proto
// Begin of protos/perfetto/metrics/android/jank_cuj_metric.proto
message AndroidJankCujMetric {
repeated Cuj cuj = 1;
// Next id: 12
message Cuj {
// ID of the CUJ that is unique within the trace.
optional int32 id = 1;
// Name of the CUJ, extracted from the CUJ trace marker.
// For example SHADE_EXPAND_COLLAPSE from J<SHADE_EXPAND_COLLAPSE>.
optional string name = 2;
// Details about the process (uid, version, etc)
optional AndroidProcessMetadata process = 3;
// ts of the CUJ trace marker slice.
optional int64 ts = 4;
// dur of the CUJ trace marker slice.
optional int64 dur = 5;
// Details about each of the frames within the CUJ.
repeated Frame frame = 6;
// Details about each of the SF frames within the CUJ.
repeated Frame sf_frame = 10;
// Metrics extracted from the counters output by FrameTracker
// Does not contain the frame_dur percentile information.
optional Metrics counter_metrics = 7;
// Metrics extracted from the frame timeline.
optional Metrics timeline_metrics = 8;
// Metrics extracted from the trace slices.
optional Metrics trace_metrics = 9;
// Layer name of the surface where the cuj is drawn.
optional string layer_name = 11;
}
// Next id: 10
message Frame {
// Index of the frame within the single user journey.
optional int64 frame_number = 1;
// VSYNC ID of the frame.
optional int64 vsync = 2;
optional int64 ts = 3;
optional int64 dur = 4;
optional int64 dur_expected = 7;
// Whether the app process missed the frame deadline.
// Only set for the App frames. Always left unset for SF frames.
optional bool app_missed = 5;
// Whether SF missed the frame deadline.
optional bool sf_missed = 6;
// Whether the SF callback missed before emitting jank metrics.
// SF callback is used to get the jank classification.
optional bool sf_callback_missed = 8;
// Whether the HWUI callback missed before emitting jank metrics.
// HWUI callback is used to get the frame duration.
optional bool hwui_callback_missed = 9;
}
// Next id: 18
message Metrics {
// Overall number of frames within the CUJ.
optional int64 total_frames = 1;
// Number of missed frames.
optional int64 missed_frames = 2;
// Number of frames missed due to the app missing the deadline.
optional int64 missed_app_frames = 3;
// Number of frames missed due to SF.
optional int64 missed_sf_frames = 4;
// Number of successive frames missed.
// Not available in timeline_metrics and trace_metrics.
optional int64 missed_frames_max_successive = 5;
// Max frame duration in nanoseconds.
optional int64 frame_dur_max = 6;
// Average frame duration in nanoseconds.
// Not available in counter_metrics.
optional int64 frame_dur_avg = 7;
// Median frame duration in nanoseconds.
// Not available in counter_metrics.
optional int64 frame_dur_p50 = 8;
// P90 frame duration in nanoseconds.
// Not available in counter_metrics.
optional int64 frame_dur_p90 = 9;
// P95 frame duration in nanoseconds.
// Not available in counter_metrics.
optional int64 frame_dur_p95 = 10;
// P99 frame duration in nanoseconds.
// Not available in counter_metrics.
optional int64 frame_dur_p99 = 11;
// Median frame duration in milliseconds.
// Not available in counter_metrics.
optional double frame_dur_ms_p50 = 12;
// P90 frame duration in milliseconds.
// Not available in counter_metrics.
optional double frame_dur_ms_p90 = 13;
// P95 frame duration in milliseconds.
// Not available in counter_metrics.
optional double frame_dur_ms_p95 = 14;
// P99 frame duration in milliseconds.
// Not available in counter_metrics.
optional double frame_dur_ms_p99 = 15;
// Number of frames with missed SF callback.
optional int64 sf_callback_missed_frames = 16;
// Number of frames with missed HWUI callback.
optional int64 hwui_callback_missed_frames = 17;
}
}
// End of protos/perfetto/metrics/android/jank_cuj_metric.proto
// Begin of protos/perfetto/metrics/android/java_heap_histogram.proto
message JavaHeapHistogram {
// Next id: 9
message TypeCount {
optional string type_name = 1;
optional string category = 4;
optional uint32 obj_count = 2;
optional uint32 reachable_obj_count = 3;
optional uint32 size_kb = 5;
optional uint32 reachable_size_kb = 6;
optional uint32 native_size_kb = 7;
optional uint32 reachable_native_size_kb = 8;
}
message Sample {
optional int64 ts = 1;
repeated TypeCount type_count = 2;
}
// Heap stats per process. One sample per dump (with continuous dump you can
// have more samples differentiated by ts).
message InstanceStats {
optional uint32 upid = 1;
optional AndroidProcessMetadata process = 2;
repeated Sample samples = 3;
}
repeated InstanceStats instance_stats = 1;
}
// End of protos/perfetto/metrics/android/java_heap_histogram.proto
// Begin of protos/perfetto/metrics/android/java_heap_stats.proto
message JavaHeapStats {
message HeapRoots {
optional string root_type = 1;
optional string type_name = 2;
optional int64 obj_count = 3;
}
// Next id: 11
message Sample {
optional int64 ts = 1;
// Size of the Java heap in bytes
optional int64 heap_size = 2;
// Native size of all the objects (not included in heap_size)
optional int64 heap_native_size = 8;
optional int64 obj_count = 4;
// Size of the reachable objects in bytes.
optional int64 reachable_heap_size = 3;
// Native size of all the reachable objects (not included in
// reachable_heap_size)
optional int64 reachable_heap_native_size = 9;
optional int64 reachable_obj_count = 5;
// Sum of anonymous RSS + swap pages in bytes.
optional int64 anon_rss_and_swap_size = 6;
// ART root objects
repeated HeapRoots roots = 7;
// OOM adjustment score
optional int64 oom_score_adj = 10;
}
// Heap stats per process. One sample per dump (can be > 1 if continuous
// dump is enabled).
message InstanceStats {
optional uint32 upid = 1;
optional AndroidProcessMetadata process = 2;
repeated Sample samples = 3;
}
repeated InstanceStats instance_stats = 1;
}
// End of protos/perfetto/metrics/android/java_heap_stats.proto
// Begin of protos/perfetto/metrics/android/lmk_metric.proto
// LMK stats on Android.
message AndroidLmkMetric {
message ByOomScore {
optional int32 oom_score_adj = 1;
optional int32 count = 2;
}
// Total count of LMK events observed in the trace.
optional int32 total_count = 1;
repeated ByOomScore by_oom_score = 2;
// OOM reaper kills. Enabled via the oom/mark_victim point. Should never
// happen.
optional int32 oom_victim_count = 3;
}
// End of protos/perfetto/metrics/android/lmk_metric.proto
// Begin of protos/perfetto/metrics/android/lmk_reason_metric.proto
// Global process state at LMK time, used to identify potential culprits.
// TODO: rename to AndroidLmkProcessState
message AndroidLmkReasonMetric {
message Process {
optional AndroidProcessMetadata process = 1;
// OOM score adj of the process.
optional int32 oom_score_adj = 2;
// RSS + swap.
optional int64 size = 3;
optional int64 file_rss_bytes = 4;
optional int64 anon_rss_bytes = 5;
optional int64 shmem_rss_bytes = 6;
optional int64 swap_bytes = 7;
}
message Lmk {
// OOM score adj of the LMK'ed process.
optional int32 oom_score_adj = 1;
// Total size of the ION heap in bytes during this LMK.
optional int64 ion_heaps_bytes = 4;
// Deprecated. Prefer ion_heaps_bytes.
optional int64 system_ion_heap_size = 2;
// Processes present during this LMK.
repeated Process processes = 3;
}
// LMKs present in the trace, ordered on their timestamp.
repeated Lmk lmks = 1;
}
// End of protos/perfetto/metrics/android/lmk_reason_metric.proto
// Begin of protos/perfetto/metrics/android/mem_metric.proto
// Memory metrics on Android.
message AndroidMemoryMetric {
message ProcessMetrics {
optional string process_name = 1;
optional ProcessMemoryCounters total_counters = 2;
repeated PriorityBreakdown priority_breakdown = 3;
}
message PriorityBreakdown {
optional string priority = 1;
optional ProcessMemoryCounters counters = 2;
}
message ProcessMemoryCounters {
optional Counter anon_rss = 1;
optional Counter file_rss = 2;
optional Counter swap = 3;
optional Counter anon_and_swap = 4;
// Available when ART trace events are available.
optional Counter java_heap = 5;
}
message Counter {
optional double min = 1;
optional double max = 2;
optional double avg = 3;
// Memory growth observed in the counter sequence. In case of multiple
// processes with the same name, break ties using max.
optional double delta = 4;
}
// Process metrics, grouped by process name
repeated ProcessMetrics process_metrics = 1;
}
// End of protos/perfetto/metrics/android/mem_metric.proto
// Begin of protos/perfetto/metrics/android/mem_unagg_metric.proto
// Unaggregated memory metrics on Android.
message AndroidMemoryUnaggregatedMetric {
message ProcessValues {
optional string process_name = 1;
optional ProcessMemoryValues mem_values = 2;
}
message ProcessMemoryValues {
repeated Value anon_rss = 1;
repeated Value file_rss = 2;
repeated Value swap = 3;
repeated Value anon_and_swap = 4;
}
message Value {
optional int64 ts = 1;
optional int32 oom_score = 2;
optional double value = 3;
}
// Process metrics for every process instance in trace.
repeated ProcessValues process_values = 1;
}
// End of protos/perfetto/metrics/android/mem_unagg_metric.proto
// Begin of protos/perfetto/metrics/android/monitor_contention_metric.proto
// This metric provides information about the monitor contention graph in a
// trace
message AndroidMonitorContentionMetric {
// Next field id: 25
message Node {
// Global context
optional int64 node_parent_id = 1;
optional int64 node_child_id = 24;
optional int64 node_id = 2;
optional int64 ts = 3;
optional int64 dur = 4;
optional string process_name = 14;
optional uint32 pid = 23;
optional uint32 waiter_count = 11;
repeated ThreadStateBreakdown thread_states = 19;
repeated BlockedFunctionBreakdown blocked_functions = 20;
// Blocking context
optional string blocking_method = 5;
optional string short_blocking_method = 7;
optional string blocking_src = 9;
optional string blocking_thread_name = 13;
optional bool is_blocking_thread_main = 16;
optional uint32 blocking_thread_tid = 22;
// Blocked context
optional string blocked_method = 6;
optional string short_blocked_method = 8;
optional string blocked_src = 10;
optional string blocked_thread_name = 12;
optional bool is_blocked_thread_main = 15;
optional uint32 blocked_thread_tid = 21;
// Binder context
optional int64 binder_reply_ts = 17;
optional uint32 binder_reply_tid = 18;
}
message ThreadStateBreakdown {
optional string thread_state = 1;
optional int64 thread_state_dur = 2;
optional int64 thread_state_count = 3;
}
message BlockedFunctionBreakdown {
optional string blocked_function = 1;
optional int64 blocked_function_dur = 2;
optional int64 blocked_function_count = 3;
}
repeated Node node = 1;
}
// End of protos/perfetto/metrics/android/monitor_contention_metric.proto
// Begin of protos/perfetto/metrics/android/multiuser_metric.proto
// Metrics for Multiuser events, such as switching users.
message AndroidMultiuserMetric {
// Holds the data for a Multiuser event.
message EventData {
// Duration of the event (in milliseconds).
optional int32 duration_ms = 1;
// CPU usage of each process during the event.
message CpuUsage {
// The userId of the process (e.g. 0 or 10).
optional int32 user_id = 1;
// The name of the process.
optional string process_name = 2;
// The number of CPU cycles (in megacycles) spent by that process during the event.
optional int32 cpu_mcycles = 3;
// The ratio of this process's cycles to the total for all processes, expressed as a percentage.
optional float cpu_percentage = 4;
// General identifier for this usage source: determined from the process name, user, etc.
// Should be stable across multiple runs (i.e. does not print the user_id directly).
optional string identifier = 5;
}
repeated CpuUsage cpu_usage = 2;
}
// Metrics for a user switch.
optional EventData user_switch = 1;
}
// End of protos/perfetto/metrics/android/multiuser_metric.proto
// Begin of protos/perfetto/metrics/android/network_metric.proto
message AndroidNetworkMetric {
message PacketStatistic {
// Packet count.
optional int64 packets = 1;
// Packet Bytes.
optional int64 bytes = 2;
// Timestamp when first packet received or transmitted.
optional int64 first_packet_timestamp_ns = 3;
// Timestamp when last packet received or transmitted.
optional int64 last_packet_timestamp_ns = 4;
// Interval between first & last packet. The minimum interval is 10ms.
optional int64 interval_ns = 5;
// Data Speed.
optional double data_rate_kbps = 6;
}
message CorePacketStatistic {
optional uint32 id = 1;
optional PacketStatistic packet_statistic = 2;
}
message Rx {
// Total packets statistic.
optional PacketStatistic total = 1;
// Per core packets statistic.
repeated CorePacketStatistic core = 2;
// GRO aggregation ratio.
optional string gro_aggregation_ratio = 3;
}
message Tx {
// Total packets statistic.
optional PacketStatistic total = 1;
// Per core packets statistic.
repeated CorePacketStatistic core = 2;
}
message NetDevice {
// Network device name.
optional string name = 1;
// Ingress traffic statistic.
optional Rx rx = 2;
// Egress traffic statistic
optional Tx tx = 3;
}
message NetRxActionStatistic {
// SoftIrq NET_RX action count.
optional int64 count = 1;
// SoftIrq NET_RX action was running in millisecond.
optional double runtime_ms = 2;
// SoftIrq NET_RX action average running time.
optional double avg_runtime_ms = 3;
// CPU megacycles (i.e. cycles divided by 1e6).
optional int64 mcycles = 4;
// Average weighted CPU frequency by the time the NET_RX Action
// running at each frequency.
optional int64 avg_freq_khz = 5;
}
message NetTxActionStatistic {
// SoftIrq NET_TX action count.
optional int64 count = 1;
// SoftIrq NET_TX action was running in millisecond.
optional double runtime_ms = 2;
// SoftIrq NET_TX action average running time.
optional double avg_runtime_ms = 3;
// CPU megacycles (i.e. cycles divided by 1e6).
optional int64 mcycles = 4;
// Average weighted CPU frequency by the time the NET_TX Action
// running at each frequency.
optional int64 avg_freq_khz = 5;
}
message IpiActionStatistic {
// SoftIrq IPI action count.
optional int64 count = 1;
// SoftIrq IPI action was running in millisecond.
optional double runtime_ms = 2;
// SoftIrq IPI action average running time.
optional double avg_runtime_ms = 3;
}
message CoreNetRxActionStatistic {
optional uint32 id = 1;
optional NetRxActionStatistic net_rx_action_statistic = 2;
}
message CoreNetTxActionStatistic {
optional uint32 id = 1;
optional NetTxActionStatistic net_tx_action_statistic = 2;
}
message NetRxAction {
// Total NET_RX action statistics.
optional NetRxActionStatistic total = 1;
// Per core NET_RX action statistics.
repeated CoreNetRxActionStatistic core = 2;
// The average packet time moves through the kernel stack.
optional double avg_interstack_latency_ms = 3;
}
message NetTxAction {
// Total NET_TX action statistics.
optional NetTxActionStatistic total = 1;
// Per core NET_TX action statistics.
repeated CoreNetTxActionStatistic core = 2;
}
message IpiAction {
// Total IPI action statistics.
optional IpiActionStatistic total = 1;
}
// Network device metrics.
repeated NetDevice net_devices = 1;
// SoftIrq NET_RX action metrics.
optional NetRxAction net_rx_action = 2;
// Packet retransmission rate.
optional double retransmission_rate = 3;
// Kfree Skb rate (i.e. kfree_skb count divided by the packet count from all
// net devices).
optional double kfree_skb_rate = 4;
// SoftIrq NET_TX action metrics.
optional NetTxAction net_tx_action = 5;
// SoftIrq IPI action metrics.
optional IpiAction ipi_action = 6;
}
// End of protos/perfetto/metrics/android/network_metric.proto
// Begin of protos/perfetto/metrics/android/other_traces.proto
message AndroidOtherTracesMetric {
// Uuids of other traces being finalized while the current trace was being
// recorded.
repeated string finalized_traces_uuid = 1;
}
// End of protos/perfetto/metrics/android/other_traces.proto
// Begin of protos/perfetto/metrics/android/package_list.proto
message AndroidPackageList {
message Package {
optional string package_name = 1;
optional int64 uid = 2;
optional int64 version_code = 3;
}
repeated Package packages = 1;
}
// End of protos/perfetto/metrics/android/package_list.proto
// Begin of protos/perfetto/metrics/android/powrails_metric.proto
message AndroidPowerRails {
// Energy data per Power Rail at given ts.
message EnergyData {
// Time since device boot(CLOCK_BOTTOMTIME) in milli-seconds.
optional int64 timestamp_ms = 1;
// Accumulated energy since device boot in microwatt-seconds(uws).
optional double energy_uws = 2;
}
message PowerRails {
// Name of the rail.
optional string name = 1;
// Energy data for given rail and for all samples in the trace.
repeated EnergyData energy_data = 2;
// The average used power between the first and the last sampled
// energy data in miliwatt (mw)
optional double avg_used_power_mw = 3;
}
// Energy data per Power Rail.
repeated PowerRails power_rails = 1;
// The average used power between the first and last sampled rail across all
// the rails in milliwatts (mw).
optional double avg_total_used_power_mw = 2;
}
// End of protos/perfetto/metrics/android/powrails_metric.proto
// Begin of protos/perfetto/metrics/android/profiler_smaps.proto
message ProfilerSmaps {
message Mapping {
optional string path = 1;
optional int32 size_kb = 2;
optional int32 private_dirty_kb = 3;
optional int32 swap_kb = 4;
}
message Instance {
optional AndroidProcessMetadata process = 1;
repeated Mapping mappings = 2;
}
repeated Instance instance = 1;
}
// End of protos/perfetto/metrics/android/profiler_smaps.proto
// Begin of protos/perfetto/metrics/android/rt_runtime_metric.proto
// measure max RT runtime and RT tasks running over 5ms.
message AndroidRtRuntimeMetric {
message RtSlice {
// thread name
optional string tname = 1;
// timestamp
optional int64 ts = 2;
// runtime of RT task
optional int64 dur = 3;
}
// max runtime of RT tasks
optional int64 max_runtime = 1;
// how many RT tasks are over 5ms.
optional int64 over_5ms_count = 2;
// information for top 10 RT tasks
repeated RtSlice longest_rt_slices = 3;
}
// End of protos/perfetto/metrics/android/rt_runtime_metric.proto
// Begin of protos/perfetto/metrics/android/simpleperf.proto
// Metric that stores information related to atrace events generated by
// simpleperf tool
message AndroidSimpleperfMetric {
optional double urgent_ratio = 1;
message PerfEventMetric {
// Simpleperf event name
optional string name = 1;
message Thread {
// Thread ID
optional int32 tid = 1;
// Thread name
optional string name = 2;
// CPU ID
optional int32 cpu = 3;
// Total counter value
optional double total = 4;
}
message Process {
// Process ID
optional int32 pid = 1;
// Process name
optional string name = 2;
// Metrics for each thread in this process.
repeated Thread threads = 3;
// Total counter value over all threads in this process
optional double total = 4;
}
// Metrics for each process
repeated Process processes = 2;
// Total counter value over all processes and threads
optional double total = 3;
}
repeated PerfEventMetric events = 2;
}
// End of protos/perfetto/metrics/android/simpleperf.proto
// Begin of protos/perfetto/metrics/android/startup_metric.proto
// Android app startup metrics.
message AndroidStartupMetric {
// A simplified view of the task state durations for a thread
// and a span of time.
message TaskStateBreakdown {
optional int64 running_dur_ns = 1;
optional int64 runnable_dur_ns = 2;
optional int64 uninterruptible_sleep_dur_ns = 3;
optional int64 interruptible_sleep_dur_ns = 4;
optional int64 uninterruptible_io_sleep_dur_ns = 5;
optional int64 uninterruptible_non_io_sleep_dur_ns = 6;
}
message McyclesByCoreType {
optional int64 little = 1;
optional int64 big = 2;
optional int64 bigger = 3;
optional int64 unknown = 4;
}
message Slice {
optional int64 dur_ns = 1;
optional double dur_ms = 2;
}
// Timing information spanning the intent received by the
// activity manager to the first frame drawn.
// Next id: 35.
message ToFirstFrame {
// The duration between the intent received and first frame.
optional int64 dur_ns = 1;
optional double dur_ms = 17;
// Breakdown of time to first frame by task state for the main thread of
// the process starting up.
optional TaskStateBreakdown main_thread_by_task_state = 2;
// The mcycles taken by this startup across all CPUs (broken down by core
// type).
optional McyclesByCoreType mcycles_by_core_type = 26;
// In this timespan, how many processes (apart from the main activity) were
// spawned.
optional uint32 other_processes_spawned_count = 3;
// Total time spent in activity manager between the initial intent
// and the end of the activity starter.
optional Slice time_activity_manager = 4;
// The following slices follow the typical steps post-fork.
optional Slice time_activity_thread_main = 5;
optional Slice time_bind_application = 6;
optional Slice time_activity_start = 7;
optional Slice time_activity_resume = 8;
optional Slice time_activity_restart = 21;
optional Slice time_choreographer = 9;
optional Slice time_inflate = 22;
optional Slice time_get_resources = 23;
// If we are starting a new process, record the duration from the
// intent being received to the time we call the zygote.
optional Slice time_before_start_process = 10;
// The actual duration of the process start (based on the zygote slice).
optional Slice time_during_start_process = 11;
optional Slice to_post_fork = 18;
optional Slice to_activity_thread_main = 19;
optional Slice to_bind_application = 20;
optional Slice time_post_fork = 16;
// The total time spent on opening dex files.
optional Slice time_dex_open = 24;
// Total time spent verifying classes during app startup.
optional Slice time_verify_class = 25;
// Number of methods that were compiled by JIT during app startup.
optional uint32 jit_compiled_methods = 27;
// Time spent running CPU on jit thread pool.
optional Slice time_jit_thread_pool_on_cpu = 28;
// Time spent on garbage collection.
optional Slice time_gc_total = 29;
optional Slice time_gc_on_cpu = 30;
// Time spent in lock contention on the main thread of the process being
// started up. This includes *all* types of lock contention not just monitor
// contention.
optional Slice time_lock_contention_thread_main = 31;
// Time spent in monitor lock contention on the main thread of the
// process being started up. This will be a subset of the time counted by
// |time_lock_contention_thread_main|.
optional Slice time_monitor_contention_thread_main = 32;
// Time spent in opening dex files on the main thread of the process
// being started up.
optional Slice time_dex_open_thread_main = 33;
// Time spent in dlopening .so files on the main thread of the process
// being started up.
optional Slice time_dlopen_thread_main = 34;
// Removed: was other_process_to_activity_cpu_ratio.
reserved 12;
// Removed: was uint32 versions of to_post_fork, to_activity_thread_main and
// to_bind_application.
reserved 13, 14, 15;
}
// Metrics about startup which were developed by looking at experiments using
// high-speed cameras (HSC).
message HscMetrics {
// The duration of the full "startup" as defined by HSC tests.
optional Slice full_startup = 1;
}
message Activity {
optional string name = 1;
optional string method = 2;
optional int64 ts_method_start = 4;
// Field 3 contained Slice with a sum of durations for matching slices.
reserved 3;
}
message BinderTransaction {
optional Slice duration = 1;
optional string thread = 2;
optional string destination_thread = 3;
optional string destination_process = 4;
// From
// https://cs.android.com/android/platform/superproject/+/main:external/perfetto/protos/perfetto/trace/ftrace/binder.proto;l=15;drc=7b6a788162a30802f4c9d8d7a30a54e25edd30f1
optional string flags = 5;
// From
// https://cs.android.com/android/platform/superproject/+/main:external/perfetto/protos/perfetto/trace/ftrace/binder.proto;l=14;drc=7b6a788162a30802f4c9d8d7a30a54e25edd30f1
optional string code = 6;
// From
// https://cs.android.com/android/platform/superproject/+/main:external/perfetto/protos/perfetto/trace/ftrace/binder.proto;l=37;drc=7b6a788162a30802f4c9d8d7a30a54e25edd30f1
optional int64 data_size = 7;
}
// Metrics with information about the status of odex files and the outcome
// of the loading process.
// Multiple files might be loaded for a single startup. Platform might also
// decide to discard an odex file and instead load a fallback, for example
// in case the OS or apk were updated.
message OptimizationStatus {
optional string odex_status = 1;
optional string compilation_filter = 2;
optional string compilation_reason = 3;
optional string location = 4;
optional string summary = 5;
}
// Contains the name and duration of class verification occurred during
// the startup.
message VerifyClass {
optional string name = 1;
optional int64 dur_ns = 2;
}
// Contains timestamps of important events which occurred during the
// startup.
message EventTimestamps {
optional int64 intent_received = 1;
optional int64 first_frame = 2;
}
// Contains information about the state of a system during the app startup.
// Useful to put the startup in context.
message SystemState {
// Whether the dex2oat64 process was running concurrent to the startup.
// Deprecated as of 10/2022.
optional bool dex2oat_running = 1 [deprecated=true];
// Whether the installd process was running concurrent to the startup.
// Deprecated as of 10/2022.
optional bool installd_running = 2 [deprecated=true];
// The number of broadcasts dispatched by the system during the app
// launch.
optional int64 broadcast_dispatched_count = 3;
// The number of broadcasts received by an app or the system during the
// app launch. Note that multiple packages can be subscribed to the same
// broadcast so a single dsipatch can cause multiple packages to receive
// and process a broadcast.
optional int64 broadcast_received_count = 4;
// The most active (i.e. consuming the most mcycles) processes during the
// app launch excluding the process(es) being launched.
// Note: the exact number of returned is an implementation detail and
// will likely change over time.
repeated string most_active_non_launch_processes = 5;
// Duration the installd process was running concurrent to the startup.
optional int64 installd_dur_ns = 6;
// Duration the dex2oat64 process was running concurrent to the startup.
optional int64 dex2oat_dur_ns = 7;
}
// Next id: 21
message Startup {
// Random id uniquely identifying an app startup in this trace.
optional uint32 startup_id = 1;
// Startup type (cold / warm / hot)
optional string startup_type = 16;
// Name of the package launched
optional string package_name = 2;
// Name of the process launched
optional string process_name = 3;
// Details about the activities launched
repeated Activity activities = 11;
// Details about slow binder transactions during the startup. The definition
// of a slow transaction is an implementation detail.
repeated BinderTransaction long_binder_transactions = 14;
// Did we ask the zygote for a new process
optional bool zygote_new_process = 4;
// Number of processes hosting the activity involved in the launch.
// This will usually be 1. If it is 0, it is indicative of a data / process
// error. If > 1, the process died during startup and the system respawned
// it.
optional uint32 activity_hosting_process_count = 6;
// Contains timestamps of important events which happened during
// the startup.
optional EventTimestamps event_timestamps = 13;
// Timing information spanning the intent received by the
// activity manager to the first frame drawn.
optional ToFirstFrame to_first_frame = 5;
// Details about the process (uid, version, etc)
optional AndroidProcessMetadata process = 7;
// Metrics about startup which were developed by looking at experiments
// using high-speed cameras (HSC).
optional HscMetrics hsc = 8;
// The time taken in the startup from intent received to the start time
// of the reportFullyDrawn slice. This should be longer than the time to
// first frame as the application decides this after it starts rendering.
optional Slice report_fully_drawn = 9;
// Contains information about the status of odex files.
repeated OptimizationStatus optimization_status = 12;
// Contains information about the class verification.
repeated VerifyClass verify_class = 19;
// Contains the dlopen file names.
repeated string dlopen_file = 20;
// Package name of startups running concurrent to the launch.
repeated string startup_concurrent_to_launch = 18;
// Contains information about the state of the rest of the system during the
// startup. This is useful for getting context about why a startup might
// be slow beyond just what the app is doing.
optional SystemState system_state = 15;
// A list of identified potential causes for slow startup.
// Optional.
repeated string slow_start_reason = 17;
reserved 10;
}
repeated Startup startup = 1;
}
// End of protos/perfetto/metrics/android/startup_metric.proto
// Begin of protos/perfetto/metrics/android/surfaceflinger.proto
message AndroidSurfaceflingerMetric {
// Counts the number of missed frames in the trace.
optional uint32 missed_frames = 1;
// Counts the number of missed HWC frames in the trace.
optional uint32 missed_hwc_frames = 2;
// Counts the number of missed GPU frames in the trace.
optional uint32 missed_gpu_frames = 3;
// Calculate the number of missed frames divided by
// total frames
optional double missed_frame_rate = 4;
// Calculate the number of missed HWC frames divided by
// total HWC frames
optional double missed_hwc_frame_rate = 5;
// Calculate the number of missed GPU frames divided by
// total GPU frames
optional double missed_gpu_frame_rate = 6;
// Count the number of times SurfaceFlinger needs to invoke GPU
// for rendering some layers
optional uint32 gpu_invocations = 7;
// Calculate the average duration of GPU request by SurfaceFlinger
// since it enters the FenceMonitor's queue until it gets completed
optional double avg_gpu_waiting_dur_ms = 8;
// Calculate the total duration when there is at least one GPU request
// by SurfaceFlinger that is still waiting for GPU to complete the
// request.
// This also equals to the total duration of
// "waiting for GPU completion <fence_num>" in SurfaceFlinger.
optional double total_non_empty_gpu_waiting_dur_ms = 9;
message MetricsPerDisplay {
// Display ID in SF
optional string display_id = 1;
// Counts the number of missed frames in the trace.
optional uint32 missed_frames = 2;
// Counts the number of missed HWC frames in the trace.
optional uint32 missed_hwc_frames = 3;
// Counts the number of missed GPU frames in the trace.
optional uint32 missed_gpu_frames = 4;
// Calculate the number of missed frames divided by
// total frames
optional double missed_frame_rate = 5;
// Calculate the number of missed HWC frames divided by
// total HWC frames
optional double missed_hwc_frame_rate = 6;
// Calculate the number of missed GPU frames divided by
// total GPU frames
optional double missed_gpu_frame_rate = 7;
}
repeated MetricsPerDisplay metrics_per_display = 10;
}
// End of protos/perfetto/metrics/android/surfaceflinger.proto
// Begin of protos/perfetto/metrics/android/task_names.proto
message AndroidTaskNames {
message Process {
optional int64 pid = 1;
// Process name.
optional string process_name = 2;
// Names of all threads for this process.
repeated string thread_name = 3;
// User id under which this process runs.
optional int64 uid = 4;
// Packages matching the process uid.
repeated string uid_package_name = 5;
// Removed, was short_lived_tasks.
reserved 6;
// Removed, was long_lived_tasks.
reserved 7;
}
repeated Process process = 1;
}
// End of protos/perfetto/metrics/android/task_names.proto
// Begin of protos/perfetto/metrics/android/trace_quality.proto
// Metric which checks the data in the trace processor tables is "reasonble"
// (i.e. we would expect to see it from a real device).
//
// This is useful to reject traces which may be valid (so no stat would be
// recorded) but a human would find the trace nonsensical.
message AndroidTraceQualityMetric {
message Failure {
// The name of the failed check.
optional string name = 1;
}
repeated Failure failures = 1;
}
// End of protos/perfetto/metrics/android/trace_quality.proto
// Begin of protos/perfetto/metrics/android/unsymbolized_frames.proto
message UnsymbolizedFrames {
message Frame {
optional string module = 1;
optional string build_id = 2;
optional int64 address = 3;
// In some cases (Chrome/Webview) the ID that should be used to query
// symbols in Google's internal tera-scale symbolization service is !=
// `build_id` and requires some mangling.
// This field is == 'build_id` for non-chromium cases, and is the breakpad
// module ID (with lowercase hex digics) for chromium cases.
optional string google_lookup_id = 4;
}
repeated Frame frames = 1;
}
// End of protos/perfetto/metrics/android/unsymbolized_frames.proto
// Begin of protos/perfetto/metrics/metrics.proto
// Trace processor metadata
message TraceMetadata {
reserved 1;
optional int64 trace_duration_ns = 2;
optional string trace_uuid = 3;
optional string android_build_fingerprint = 4;
optional int64 statsd_triggering_subscription_id = 5;
optional int64 trace_size_bytes = 6;
repeated string trace_trigger = 7;
optional string unique_session_name = 8;
optional string trace_config_pbtxt = 9;
optional int64 sched_duration_ns = 10;
}
// Stats counters for the trace.
// Defined in src/trace_processor/storage/stats.h
message TraceAnalysisStats {
enum Severity {
SEVERITY_UNKNOWN = 0;
SEVERITY_INFO = 1;
SEVERITY_DATA_LOSS = 2;
SEVERITY_ERROR = 3;
}
enum Source {
SOURCE_UNKNOWN = 0;
SOURCE_TRACE = 1;
SOURCE_ANALYSIS = 2;
}
message Stat {
optional string name = 1;
optional uint32 idx = 2;
optional Severity severity = 3;
optional Source source = 4;
optional int64 count = 5;
}
repeated Stat stat = 1;
}
// Root message for all Perfetto-based metrics.
//
// Next id: 56
message TraceMetrics {
reserved 4, 10, 13, 14, 16, 19;
// Battery counters metric on Android.
optional AndroidBatteryMetric android_batt = 5;
// CPU usage per trace, process and thread.
optional AndroidCpuMetric android_cpu = 6;
// Memory metrics on Android (owned by the Android Telemetry team).
optional AndroidMemoryMetric android_mem = 1;
// Memory metrics on Android in unaggregated form. (owned by the Android
// Telemetry team).
// Note: this generates a lot of data so should not be requested unless it
// is clear that this data is necessary.
optional AndroidMemoryUnaggregatedMetric android_mem_unagg = 11;
// Package list.
optional AndroidPackageList android_package_list = 12;
// ion buffer memory metrics.
optional AndroidIonMetric android_ion = 9;
// fastrpc subsystem memory metrics.
optional AndroidFastrpcMetric android_fastrpc = 31;
// Statistics about low memory kills.
optional AndroidLmkMetric android_lmk = 8;
// Power Rails metrics on Android.
optional AndroidPowerRails android_powrails = 7;
// Startup metrics on Android (owned by the Android Telemetry team).
optional AndroidStartupMetric android_startup = 2;
// Trace metadata (applicable to all traces).
optional TraceMetadata trace_metadata = 3;
// Trace stats (applicable to all traces).
optional TraceAnalysisStats trace_stats = 33;
// Returns stack frames missing symbols.
optional UnsymbolizedFrames unsymbolized_frames = 15;
// If the trace contains a heap graph, output allocation statistics.
optional JavaHeapStats java_heap_stats = 17;
// If the trace contains a heap graph, output histogram.
optional JavaHeapHistogram java_heap_histogram = 21;
// Metrics used to find potential culprits of low-memory kills.
optional AndroidLmkReasonMetric android_lmk_reason = 18;
optional AndroidHwuiMetric android_hwui_metric = 20;
optional AndroidDisplayMetrics display_metrics = 22;
optional AndroidTaskNames android_task_names = 23;
// Deprecated was AndroidThreadTimeInStateMetric
reserved 24;
// Metric associated with surfaceflinger.
optional AndroidSurfaceflingerMetric android_surfaceflinger = 25;
// GPU metrics on Android.
optional AndroidGpuMetric android_gpu = 26;
// Deprecated AndroidSysUiCujMetrics.
reserved 27;
// Interaction and frame timings for CUJs (important UI transitions).
optional AndroidJankCujMetric android_jank_cuj = 48;
// Metric associated with hwcomposer.
optional AndroidHwcomposerMetrics android_hwcomposer = 28;
// Deprecated was AndroidJankMetrics;
reserved 29;
// G2D metrics.
optional G2dMetrics g2d = 30;
// Dmabuf heap metrics.
optional AndroidDmaHeapMetric android_dma_heap = 32;
// Metric to verify the quality of the trace.
optional AndroidTraceQualityMetric android_trace_quality = 34;
// Profiler smaps
optional ProfilerSmaps profiler_smaps = 35;
// Multiuser - metrics for switching users.
optional AndroidMultiuserMetric android_multiuser = 36;
// Metrics related to simpleperf tool
optional AndroidSimpleperfMetric android_simpleperf = 37;
// Metrics for the Camera team.
optional AndroidCameraMetric android_camera = 38;
// Metrics for dynamic voltage and frequency scaling.
optional AndroidDvfsMetric android_dvfs = 39;
// Metrics for network performance.
optional AndroidNetworkMetric android_netperf = 40;
// Metrics for the Camera team.
// Note: this generates a lot of data so should not be requested unless it
// is clear that this data is necessary.
optional AndroidCameraUnaggregatedMetric android_camera_unagg = 41;
// Metrics for RT runtime.
optional AndroidRtRuntimeMetric android_rt_runtime = 42;
// Metrics for IRQ runtime.
optional AndroidIrqRuntimeMetric android_irq_runtime = 43;
// Metrics for the Trusty team.
optional AndroidTrustyWorkqueues android_trusty_workqueues = 44;
// Summary of other concurrent trace recording.
optional AndroidOtherTracesMetric android_other_traces = 45;
// Per-process Binder transaction metrics.
optional AndroidBinderMetric android_binder = 46;
// Metrics for app deadline missed.
optional AndroidFrameTimelineMetric android_frame_timeline_metric = 47;
// Blocking calls (e.g. binder calls) for CUJs (important UI transitions).
optional AndroidBlockingCallsCujMetric android_blocking_calls_cuj_metric = 49;
optional AndroidMonitorContentionMetric android_monitor_contention = 50;
optional AndroidSysUINotificationsBlockingCallsMetric android_sysui_notifications_blocking_calls_metric = 51;
// Metrics to track codec framework.
optional AndroidCodecMetrics codec_metrics = 52;
// Metric to track Android IO.
optional AndroidIo android_io = 53;
// IO metrics on Android in unaggregated form.
// Note: this generates a lot of data so should not be requested unless it
// is clear that this data is necessary.
optional AndroidIoUnaggregated android_io_unagg = 54;
// Metrics for App Not Responding (ANR) errors.
optional AndroidAnrMetric android_anr = 55;
// Demo extensions.
extensions 450 to 499;
// Vendor extensions.
extensions 500 to 1000;
// Chrome metrics.
extensions 1001 to 2000;
// WebView metrics.
extensions 2001 to 2500;
}
// End of protos/perfetto/metrics/metrics.proto