// 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/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;

  reserved 3, 4, 5, 6;
}

// End of protos/perfetto/metrics/android/process_metadata.proto

// Begin of protos/perfetto/metrics/android/android_frame_timeline_metric.proto

message AndroidFrameTimelineMetric {
  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;

    reserved 1, 2;
  }

  optional int64 total_frames = 4;
  optional int64 missed_app_frames = 5;

  repeated ProcessBreakdown process = 2;

  reserved 1;
}


// End of protos/perfetto/metrics/android/android_frame_timeline_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/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 per-process Binder statistics for traces with binder_driver enabled
// Specifically, transactions are categorized and counted
message AndroidBinderMetric {
  message PerProcessBreakdown {
    optional string process_name = 1;
    optional uint32 pid = 2;
    optional string slice_name = 3;
    optional uint32 count = 4;
  }

  repeated PerProcessBreakdown process_breakdown = 1;
}
// 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 value = 2;
  }

  // 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 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/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_ms = 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 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;
}

// 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/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: 11
  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;
  }

  // Next id: 8
  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;
  }

  // Next id: 12
  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.
    // Not available in counter_metrics.
    optional int64 frame_dur_max = 6;

    // Average frame duration.
    // Not available in counter_metrics.
    optional int64 frame_dur_avg = 7;

    // Median frame duration.
    // Not available in counter_metrics.
    optional int64 frame_dur_p50 = 8;

    // P90 frame duration.
    // Not available in counter_metrics.
    optional int64 frame_dur_p90 = 9;

    // P95 frame duration.
    // Not available in counter_metrics.
    optional int64 frame_dur_p95 = 10;

    // P99 frame duration.
    // Not available in counter_metrics.
    optional int64 frame_dur_p99 = 11;
  }
}

// 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: 10
  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;
  }

  // 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/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;
  }

  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: 33.
  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;

    // 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/+/master:external/perfetto/protos/perfetto/trace/ftrace/binder.proto;l=15;drc=7b6a788162a30802f4c9d8d7a30a54e25edd30f1
    optional string flags = 5;
    // From
    // https://cs.android.com/android/platform/superproject/+/master:external/perfetto/protos/perfetto/trace/ftrace/binder.proto;l=14;drc=7b6a788162a30802f4c9d8d7a30a54e25edd30f1
    optional string code = 6;
    // From
    // https://cs.android.com/android/platform/superproject/+/master: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;
  }

  // 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.
    optional bool dex2oat_running = 1;

    // Whether the installd process was running concurrent to the startup.
    optional bool installd_running = 2;

    // 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;
  }

  // Next id: 18
  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 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;
}

// End of protos/perfetto/metrics/android/surfaceflinger.proto

// Begin of protos/perfetto/metrics/android/sysui_cuj_metrics.proto

// Metric that stores frame information and potential jank root causes
// for a single Android system UI interaction/user journey.
message AndroidSysUiCujMetrics {
  // A list of all frames within the SysUi user journey.
  repeated Frame frames = 1;

  optional string cuj_name = 2;
  optional int64 cuj_start = 3;
  optional int64 cuj_dur = 4;

  // Details about the process (uid, version, etc)
  optional AndroidProcessMetadata process = 5;

  message Frame {
    // Index of the frame within the single user journey.
    optional int64 number = 1;
    optional int64 vsync = 5;
    optional int64 ts = 2;
    optional int64 dur = 3;

    // A list of identified potential causes for jank.
    // Optional.
    repeated string jank_cause = 4;
  }
}

// End of protos/perfetto/metrics/android/sysui_cuj_metrics.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;
  }

  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: 49
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;

  // Frame timing and jank root causes for system UI interactions.
  optional AndroidSysUiCujMetrics android_sysui_cuj = 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;

  // Demo extensions.
  extensions 450 to 499;

  // Vendor extensions.
  extensions 500 to 1000;

  // Chrome metrics.
  extensions 1001 to 2000;
}

// End of protos/perfetto/metrics/metrics.proto
