// 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/ad_services_metric.proto // Next: 8 message AdServicesUiMetric { optional double common_service_initialization_latency = 1; optional double common_service_permission_check_latency = 2; optional double common_service_ux_engine_flow_latency = 3; optional double main_activity_creation_latency = 4; optional double consent_manager_initialization_latency = 5; optional double consent_manager_read_latency = 6; optional double consent_manager_write_latency = 7; } // Next: 2 message AdServicesAdIdMetric { optional double latency = 1; } // Next: 2 message AdServicesAppSetIdMetric { optional double latency = 1; } // Next: 5 message OnDevicePersonalizationMetric { optional double managing_service_initialization_latency = 1; optional double service_delegate_execute_flow_latency = 2; optional double service_delegate_request_surface_package_latency = 3; optional double service_delegate_register_web_trigger_latency = 4; } // Next: 5 message AdServicesMetric { repeated AdServicesUiMetric ui_metric = 1; repeated AdServicesAdIdMetric ad_id_metric = 2; repeated AdServicesAppSetIdMetric app_set_id_metric = 3; repeated OnDevicePersonalizationMetric odp_metric = 4; } // End of protos/perfetto/metrics/android/ad_services_metric.proto // Begin of protos/perfetto/metrics/android/android_anomaly_metric.proto // Detects outlier scenarios in different Android Systems in a trace. For now, this just // detects high binder transaction rates. In the future, there could be others // like garbage_collection, CPU, broadcasts, etc. message AndroidAnomalyMetric { enum Unit { UNIT_UNSPECIFIED = 0; COUNT_PER_SECOND = 1; } // For anomalies related to a particular process. message ProcessAnomaly { optional string process_name = 1; optional uint32 pid = 2; optional Unit unit = 3; optional uint32 value = 4; } // Binder subsystem outliers with the following aggegations: // 1. Max incoming binder transaction count from each process over a one second sliding window. // 2. Max outgoing binder transaction count from each process over a one second sliding window. message Binder { repeated ProcessAnomaly max_incoming_process_count_per_second = 1; repeated ProcessAnomaly max_outgoing_process_count_per_second = 2; } optional Binder binder = 1; } // End of protos/perfetto/metrics/android/android_anomaly_metric.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; // Avg duration within the CUJ optional int64 avg_dur_ms = 9; // Avg duration within the CUJ in nanoseconds optional int64 avg_dur_ns = 10; } // 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 (:)?. 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; // Pid of the process name. optional int64 pid = 9; reserved 3, 4, 5, 6, 8; } // 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. 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_blocking_calls_unagg.proto // All blocking calls for a trace. Shows count and total duration for each. message AndroidBlockingCallsUnagg { repeated ProcessWithBlockingCalls process_with_blocking_calls = 1; message ProcessWithBlockingCalls { // Details about the process (uid, version, etc) optional AndroidProcessMetadata process = 1; // List of blocking calls on the process main thread. repeated AndroidBlockingCall blocking_calls = 2; } } // End of protos/perfetto/metrics/android/android_blocking_calls_unagg.proto // Begin of protos/perfetto/metrics/android/android_boot.proto // This metric computes how much time processes spend in UNINTERRUPTIBLE_SLEEP // state message ProcessStateDurations { optional int64 total_dur = 2; optional int64 uninterruptible_sleep_dur = 3; } message AndroidBootMetric { optional ProcessStateDurations system_server_durations = 1; optional ProcessStateDurations systemui_durations = 2; optional ProcessStateDurations launcher_durations = 3; optional ProcessStateDurations gms_durations = 4; // Launcher related boot metrics message LauncherBreakdown { // reports cold start time of NexusLauncher optional int64 cold_start_dur = 1; } optional LauncherBreakdown launcher_breakdown = 5; message ProcessStartAggregation { optional int64 total_start_sum = 1; optional int64 num_of_processes = 2; optional double average_start_time = 3; } message GarbageCollectionAggregation { optional int64 total_gc_count = 1; optional int64 num_of_processes_with_gc = 2; optional int64 num_of_threads_with_gc = 3; optional double avg_gc_duration = 4; optional double avg_running_gc_duration = 5; optional int64 full_gc_count = 6; optional int64 collector_transition_gc_count = 7; optional int64 young_gc_count = 8; optional int64 native_alloc_gc_count = 9; optional int64 explicit_gc_count = 10; optional int64 alloc_gc_count = 11; optional double mb_per_ms_of_gc = 12; } message OomAdjusterTransitionCounts { // name of the item aggregated by. example: process_name, // oom_adjuster_reason. optional string name = 1; // name of previous oom bucket. optional string src_bucket = 2; // name of oom bucket. optional string dest_bucket = 3; // count of transitions optional int64 count = 4; } message OomAdjBucketDurationAggregation { // name of the item aggregated by. example: process_name, // oom_adjuster_reason optional string name = 1; // name of oom bucket. optional string bucket = 2; // Duration of the time in the bucket optional int64 total_dur = 3; } message OomAdjDurationAggregation { optional int64 min_oom_adj_dur = 1; optional int64 max_oom_adj_dur = 2; optional double avg_oom_adj_dur = 3; optional int64 oom_adj_event_count = 4; optional string oom_adj_reason = 5; } message BroadcastCountAggregation { optional string name = 1; optional int64 count = 2; } // Stats for Broadcasts aggregated with duration. message BroadcastDurationAggregation { optional string name = 1; optional double avg_duration = 2; optional int64 max_duration = 3; optional int64 sum_duration = 4; } optional ProcessStartAggregation full_trace_process_start_aggregation = 6; optional ProcessStartAggregation post_boot_process_start_aggregation = 7; optional GarbageCollectionAggregation full_trace_gc_aggregation = 8; optional GarbageCollectionAggregation post_boot_gc_aggregation = 9; repeated OomAdjusterTransitionCounts post_boot_oom_adjuster_transition_counts_global = 10; repeated OomAdjusterTransitionCounts post_boot_oom_adjuster_transition_counts_by_process = 11; repeated OomAdjusterTransitionCounts post_boot_oom_adjuster_transition_counts_by_oom_adj_reason = 12; repeated OomAdjBucketDurationAggregation post_boot_oom_adj_bucket_duration_agg_global = 13; repeated OomAdjBucketDurationAggregation post_boot_oom_adj_bucket_duration_agg_by_process = 14; repeated OomAdjDurationAggregation post_boot_oom_adj_duration_agg = 15; repeated BroadcastCountAggregation post_boot_broadcast_process_count_by_intent = 16; repeated BroadcastCountAggregation post_boot_broadcast_count_by_process = 17; repeated BroadcastDurationAggregation post_boot_brodcast_duration_agg_by_intent = 18; repeated BroadcastDurationAggregation post_boot_brodcast_duration_agg_by_process = 19; } // End of protos/perfetto/metrics/android/android_boot.proto // Begin of protos/perfetto/metrics/android/android_garbage_collection_unagg_metric.proto message AndroidGarbageCollectionUnaggMetric { message GarbageCollectionEvent { // Name of thread running garbage collection. optional string thread_name = 1; // Name of process running garbage collection. optional string process_name = 2; // Type of garbage collection. optional string gc_type = 3; // Whether gargage collection is mark compact or copying. optional int64 is_mark_compact = 4; // MB reclaimed after garbage collection. optional double reclaimed_mb = 5; // Minimum heap size in MB during garbage collection. optional double min_heap_mb = 6; // Maximum heap size in MB during garbage collection. optional double max_heap_mb = 7; // Memory reclaimed per ms of running time. optional double mb_per_ms_of_running_gc = 8; // Memory reclaimed per ms of wall time. optional double mb_per_ms_of_wall_gc = 9; // Garbage collection wall duration. optional int64 gc_dur = 10; // Garbage collection duration spent executing on CPU. optional int64 gc_running_dur = 11; // Garbage collection duration spent waiting for CPU. optional int64 gc_runnable_dur = 12; // Garbage collection duration spent waiting in the Linux kernel on IO. optional int64 gc_unint_io_dur = 13; // Garbage collection duration spent waiting in the Linux kernel without IO. optional int64 gc_unint_non_io_dur = 14; // Garbage collection duration spent waiting in interruptible sleep. optional int64 gc_int_dur = 15; // ts of the event in trace. optional int64 gc_ts = 16; // pid of the event in trace. optional int64 pid = 17; // tid of the event in trace. optional int64 tid = 18; // monotonic duration of event. optional int64 gc_monotonic_dur = 19; } repeated GarbageCollectionEvent gc_events = 1; } // End of protos/perfetto/metrics/android/android_garbage_collection_unagg_metric.proto // Begin of protos/perfetto/metrics/android/app_process_starts_metric.proto message AndroidAppProcessStartsMetric { // Next id : 4 message ProcessStart { optional string process_name = 1; optional string intent = 2; optional string reason = 3; optional int64 proc_start_dur = 4; optional int64 bind_app_dur = 5; optional int64 intent_dur = 6; optional int64 total_dur = 7; } // Provides java process startup information for // all processes starting after Boot completed broadcast in a trace. repeated ProcessStart all_apps = 1; // Provides java process startup information for all // processes started from a broadcast after Boot Complete broadcasts. repeated ProcessStart started_by_broadcast = 2; // Provides java process startup information for all // processes started from a service after Boot Complete broadcasts. repeated ProcessStart started_by_service = 3; } // End of protos/perfetto/metrics/android/app_process_starts_metric.proto // Begin of protos/perfetto/metrics/android/android_boot_unagg.proto message AndroidBootUnagg { // Looks at all apps started after boot complete broadcast. optional AndroidAppProcessStartsMetric android_app_process_start_metric = 1; // Looks at all GC that occurs after boot complete broadcast. optional AndroidGarbageCollectionUnaggMetric android_post_boot_gc_metric = 2; } // End of protos/perfetto/metrics/android/android_boot_unagg.proto // Begin of protos/perfetto/metrics/android/android_broadcasts_metric.proto // Provides aggregated information about broadcasts message AndroidBroadcastsMetric { // Next id: 5 // Stats for Broadcasts aggregated with count. message BroadcastCountAggregation { optional string name = 1; optional int64 count = 2; } // Stats for Broadcasts aggregated with duration. message BroadcastDurationAggregation { optional string name = 1; optional double avg_duration = 2; optional int64 max_duration = 3; optional int64 sum_duration = 4; } repeated BroadcastCountAggregation process_count_by_intent = 1; repeated BroadcastCountAggregation broadcast_count_by_process = 2; repeated BroadcastDurationAggregation brodcast_duration_agg_by_intent = 3; repeated BroadcastDurationAggregation brodcast_duration_agg_by_process = 4; } // End of protos/perfetto/metrics/android/android_broadcasts_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_oom_adjuster_metric.proto message AndroidOomAdjusterMetric { message OomAdjusterTransitionCounts { // name of the item aggregated by. example: process_name, // oom_adjuster_reason. optional string name = 1; // name of previous oom bucket. optional string src_bucket = 2; // name of oom bucket. optional string dest_bucket = 3; // count of transitions optional int64 count = 4; } message OomAdjBucketDurationAggregation { // name of the item aggregated by. example: process_name, // oom_adjuster_reason optional string name = 1; // name of oom bucket. optional string bucket = 2; // Duration of the time in the bucket optional int64 total_dur = 3; } message OomAdjDurationAggregation { optional int64 min_oom_adj_dur = 1; optional int64 max_oom_adj_dur = 2; optional double avg_oom_adj_dur = 3; optional int64 oom_adj_event_count = 4; optional string oom_adj_reason = 5; } repeated OomAdjusterTransitionCounts oom_adjuster_transition_counts_global = 1; repeated OomAdjusterTransitionCounts oom_adjuster_transition_counts_by_process = 2; repeated OomAdjusterTransitionCounts oom_adjuster_transition_counts_by_oom_adj_reason = 3; repeated OomAdjBucketDurationAggregation oom_adj_bucket_duration_agg_global = 4; repeated OomAdjBucketDurationAggregation oom_adj_bucket_duration_agg_by_process = 5; repeated OomAdjDurationAggregation oom_adj_duration_agg = 6; } // End of protos/perfetto/metrics/android/android_oom_adjuster_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/auto_metric.proto // Metrics for Multiuser events, such as switching users. message AndroidAutoMultiuserMetric { message EventData { // Id of the user the system has been switched to optional int32 user_id = 1; // The end event name for which the duration_ms is measured optional string start_event = 2; // The end event name for which the duration_ms is measured optional string end_event = 3; // Duration of the event (in milliseconds). optional int64 duration_ms = 4; // Previous user resource usage info during user switch message UserData { // Id of the user the system has been switched from optional int32 user_id = 1; optional int64 total_cpu_time_ms = 2; optional int64 total_memory_usage_kb = 3; } optional UserData previous_user_info = 5; } // Metrics for a user switch. repeated EventData user_switch = 1; } // End of protos/perfetto/metrics/android/auto_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; // Average power over the duration of the trace. optional double avg_power_mw = 9; } // 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: 31 message UnaggregatedTxnBreakdown { // General optional string aidl_name = 1; optional int64 aidl_ts = 22; optional int64 aidl_dur = 23; 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_monotonic_dur = 28; optional int64 client_oom_score = 19; optional int64 client_package_version_code = 24; optional bool is_client_package_debuggable = 25; // 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_monotonic_dur = 29; optional int64 server_oom_score = 20; optional int64 server_package_version_code = 26; optional bool is_server_package_debuggable = 27; // Aggregations repeated ThreadStateBreakdown thread_states = 13; repeated BlockedFunctionBreakdown blocked_functions = 14; repeated LogicalReasonBreakdown logical_reasons = 31; 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; } message LogicalReasonBreakdown { optional string thread_state_type = 1; optional string reason = 2; optional int64 reason_dur = 3; } 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; // CPU cycles optional int64 cpu_cycles = 4; } // 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; } // Shows energy breakdown base on subsystem message EnergyBreakdown { // name of subsystem optional string subsystem = 1; // energy consumed by this system optional double energy = 2; } // have the energy usage for the codec running time message EnergyUsage { // total energy taken by the system during this time optional double total_energy = 1; // total time for this energy is calculated optional int64 duration = 2; // enery breakdown by subsystem repeated EnergyBreakdown subsystem = 3; } repeated CpuUsage cpu_usage = 1; repeated CodecFunction codec_function = 2; optional EnergyUsage energy_usage = 3; } // 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 { message ProcessStats { // process that either directly or indirectly allocated the buffers optional string process_name = 1; // Bytes allocated but not freed during this trace optional int32 delta_bytes = 2; } 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; // Total delta size (bytes allocated but not freed during the trace) optional int32 total_delta_bytes = 5; repeated ProcessStats process_stats = 6; } // 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 distinct_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. 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_class_stats.proto message JavaHeapClassStats { // Next id: 13 message TypeCount { reserved 11; optional string type_name = 1; optional bool is_libcore_or_array = 12; optional int64 obj_count = 2; optional int64 size_bytes = 3; optional int64 native_size_bytes = 4; optional int64 reachable_obj_count = 5; optional int64 reachable_size_bytes = 6; optional int64 reachable_native_size_bytes = 7; optional int64 dominated_obj_count = 8; optional int64 dominated_size_bytes = 9; optional int64 dominated_native_size_bytes = 10; } message Sample { optional int64 ts = 1; repeated TypeCount type_count = 2; } // 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 perfetto.protos.AndroidProcessMetadata process = 2; repeated Sample samples = 3; } repeated InstanceStats instance_stats = 1; } // End of protos/perfetto/metrics/android/java_heap_class_stats.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: 12 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; // Process uptime in millis at the time of the heap dump optional int64 process_uptime_ms = 11; } // 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_agg_metric.proto // This metric provides aggregated information about monitor contention graph // in a trace message AndroidMonitorContentionAggMetric { // Next id: 2 // Stats for Monitor contention aggregated by process. message ProcessAggregation { optional string name = 1; optional int64 total_contention_count = 2; optional int64 total_contention_dur = 3; optional int64 main_thread_contention_count = 4; optional int64 main_thread_contention_dur = 5; } repeated ProcessAggregation process_aggregation = 1; } // End of protos/perfetto/metrics/android/monitor_contention_agg_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: 26 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 int64 monotonic_dur = 25; 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: 36. 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; // The duration from launch to first running state thread of startup // process. optional Slice time_to_running_state = 35; 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/+/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/+/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/+/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; } // Contains detailed information for slow startup causes. message SlowStartReasonDetailed { optional string reason = 1; optional string details = 2; } // Contains information for slow startup causes. // Next id: 11. message SlowStartReason { // Points to reason description and solution. enum ReasonId { REASON_ID_UNSPECIFIED = 0; NO_BASELINE_OR_CLOUD_PROFILES = 1; RUN_FROM_APK = 2; UNLOCK_RUNNING = 3; APP_IN_DEBUGGABLE_MODE = 4; GC_ACTIVITY = 5; DEX2OAT_RUNNING = 6; INSTALLD_RUNNING = 7; MAIN_THREAD_TIME_SPENT_IN_RUNNABLE = 8; MAIN_THREAD_TIME_SPENT_IN_INTERRUPTIBLE_SLEEP = 9; MAIN_THREAD_TIME_SPENT_IN_BLOCKING_IO = 10; MAIN_THREAD_TIME_SPENT_IN_OPEN_DEX_FILES_FROM_OAT = 11; TIME_SPENT_IN_BIND_APPLICATION = 12; TIME_SPENT_IN_VIEW_INFLATION = 13; TIME_SPENT_IN_RESOURCES_MANAGER_GET_RESOURCES = 14; TIME_SPENT_VERIFYING_CLASSES = 15; POTENTIAL_CPU_CONTENTION_WITH_ANOTHER_PROCESS = 16; JIT_ACTIVITY = 17; MAIN_THREAD_LOCK_CONTENTION = 18; MAIN_THREAD_MONITOR_CONTENTION = 19; JIT_COMPILED_METHODS = 20; BROADCAST_DISPATCHED_COUNT = 21; BROADCAST_RECEIVED_COUNT = 22; STARTUP_RUNNING_CONCURRENT = 23; MAIN_THREAD_BINDER_TRANSCATIONS_BLOCKED = 24; } optional ReasonId reason_id = 1; // Brief description for human readability. optional string reason = 2; // Severity level for a reason. enum SeverityLevel { SEVERITY_UNSPECIFIED = 0; ERROR = 1; WARNING = 2; INFO = 3; } optional SeverityLevel severity = 10; // Expected value (inherited from threshold definition). optional ThresholdValue expected_value = 3; // Actual value, can be used to decide severity level. optional ActualValue actual_value = 4; // Launch duration optional int64 launch_dur = 5; // Sum of durations of slices and thread states in trace_slices_or_threads. // Can be used to decide if a couple of top slices or threads caused the // issue. optional int64 duration = 6; // Information of a subset of slice and thread sections to focused on, // sorted by the duration in descending order. // By checking out the top slices/threads, developers can identify specific // slices or threads for further investigation. repeated TraceSliceSection trace_slice_sections = 7; repeated TraceThreadSection trace_thread_sections = 8; // Details specific for a reason. optional string additional_info = 9; } message ThresholdValue { // Expected value. 1 for true and 0 for false for booleans. optional int64 value = 1; // Expected value unit. Enum, e.g. "ns", "%" enum ThresholdUnit { THRESHOLD_UNIT_UNSPECIFIED = 0; NS = 1; PERCENTAGE = 2; TRUE_OR_FALSE = 3; COUNT = 4; } optional ThresholdUnit unit = 2; // For numeric threshold values only. When higher_expected is true, // an app startup is considered performant if actual value is higher // than the threshold. optional bool higher_expected = 3; } message ActualValue { // Actual value. 1 for true and 0 for false for booleans. optional int64 value = 1; // Actual duration for percentage thresholds only. // E.g. if the threashold is 20% and the launch_duration is 1000ms, // then the actual duration is more than 200ms. optional int64 dur = 2; } // Contains information for a section of a slice. message TraceSliceSection { optional int64 start_timestamp = 1; optional int64 end_timestamp = 2; optional uint32 slice_id = 3; optional string slice_name = 4; } // Contains information for a section of a thread. message TraceThreadSection { optional int64 start_timestamp = 1; optional int64 end_timestamp = 2; // Deprecated as of 09/2024 optional uint32 thread_utid = 3; optional string thread_name = 4; } // Next id: 26 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; // Number of CPUs the device has optional uint32 cpu_count = 25; // 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; // Time it takes to display the first frame of the app`s UI. // Details: // https://developer.android.com/topic/performance/vitals/launch-time#time-initial optional int64 time_to_initial_display = 22; // Time to full display (TTFD) is the time ittakes for an app to become // interactive for the user. // Datails: // https://developer.android.com/topic/performance/vitals/launch-time#time-full optional int64 time_to_full_display = 23; // 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; // Same as slow_start_reason, but with more detailed information, obsolete. repeated SlowStartReasonDetailed slow_start_reason_detailed = 21; // Similar to slow_start_reason_detailed, but with much more comprehensive // info. such as expected threshold, actual value and threads/slices to // inspect. slow_start_reason will be obsolete once // slow_start_reason_with_details is completed since // slow_start_reason_with_details contains all the data in slow_start_reason // and more. repeated SlowStartReason slow_start_reason_with_details = 24; 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 " 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/sysui_slice_performance_statistical_data.proto // Statistical performance data row for a set of slices message SysUiSlicePerformanceStatisticalData { // Name of the Slice optional string name = 1; // Number of times it happened within the CUJ optional int64 cnt = 2; // Average duration within the CUJ optional int64 avg_dur_ms = 3; // Maximal duration within the CUJ optional int64 max_dur_ms = 4; // Average duration within the CUJ in nanoseconds optional int64 avg_dur_ns = 6; // Maximal duration within the CUJ in nanoseconds optional int64 max_dur_ns = 7; } // End of protos/perfetto/metrics/android/sysui_slice_performance_statistical_data.proto // Begin of protos/perfetto/metrics/android/sysui_notif_shade_list_builder_metric.proto // System UI Notifications ShadeListBuilder.buildList slices. // Shows count, average duration, and max duration for each. message SysuiNotifShadeListBuilderMetric { optional SysUiSlicePerformanceStatisticalData all_slices_performance = 1; optional SysUiSlicePerformanceStatisticalData slices_with_inflation_performance = 2; optional SysUiSlicePerformanceStatisticalData slices_with_modification_performance = 3; // Data row for a single slice message SliceDuration { // Name of the Slice optional string name = 1; // Duration in ms optional int64 dur_ms = 2; // Duration in ns optional int64 dur_ns = 3; } repeated SliceDuration slice = 4; } // End of protos/perfetto/metrics/android/sysui_notif_shade_list_builder_metric.proto // Begin of protos/perfetto/metrics/android/sysui_update_notif_on_ui_mode_changed_metric.proto // System UI Notifications ShadeListBuilder.buildList slices. // Shows count, average duration, and max duration for each. message SysuiUpdateNotifOnUiModeChangedMetric { optional SysUiSlicePerformanceStatisticalData all_slices_performance = 1; // Data row for a single slice message SliceDuration { // Name of the Slice optional string name = 1; // Duration in ms optional int64 dur_ms = 2; // Duration in ns optional int64 dur_ns = 3; } repeated SliceDuration slice = 2; } // End of protos/perfetto/metrics/android/sysui_update_notif_on_ui_mode_changed_metric.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/android/wattson_in_time_period.proto message AndroidWattsonTimePeriodMetric { optional int32 metric_version = 1; repeated AndroidWattsonEstimateInfo period_info = 2; } message AndroidWattsonEstimateInfo { optional int32 period_id = 1; optional int64 period_dur = 2; optional AndroidWattsonCpuSubsystemEstimate cpu_subsystem = 3; } message AndroidWattsonCpuSubsystemEstimate { // estimates and estimates of subrails optional float estimated_mw = 1; optional AndroidWattsonPolicyEstimate policy0 = 2; optional AndroidWattsonPolicyEstimate policy1 = 3; optional AndroidWattsonPolicyEstimate policy2 = 4; optional AndroidWattsonPolicyEstimate policy3 = 5; optional AndroidWattsonPolicyEstimate policy4 = 6; optional AndroidWattsonPolicyEstimate policy5 = 7; optional AndroidWattsonPolicyEstimate policy6 = 8; optional AndroidWattsonPolicyEstimate policy7 = 9; optional AndroidWattsonDsuScuEstimate dsu_scu = 10; } message AndroidWattsonPolicyEstimate { optional float estimated_mw = 1; optional AndroidWattsonCpuEstimate cpu0 = 2; optional AndroidWattsonCpuEstimate cpu1 = 3; optional AndroidWattsonCpuEstimate cpu2 = 4; optional AndroidWattsonCpuEstimate cpu3 = 5; optional AndroidWattsonCpuEstimate cpu4 = 6; optional AndroidWattsonCpuEstimate cpu5 = 7; optional AndroidWattsonCpuEstimate cpu6 = 8; optional AndroidWattsonCpuEstimate cpu7 = 9; } message AndroidWattsonCpuEstimate { optional float estimated_mw = 1; } message AndroidWattsonDsuScuEstimate { optional float estimated_mw = 1; } // End of protos/perfetto/metrics/android/wattson_in_time_period.proto // Begin of protos/perfetto/metrics/android/wattson_tasks_attribution.proto message AndroidWattsonTasksAttributionMetric { optional int32 metric_version = 1; // Lists tasks (e.g. threads, process, package) and associated estimates repeated AndroidWattsonTaskInfo task_info = 2; } message AndroidWattsonTaskInfo { // Average estimated power for wall duration in mW optional float estimated_mw = 1; // Total energy over wall duration across CPUs in mWs optional float estimated_mws = 2; optional string thread_name = 3; optional string process_name = 4; optional string package_name = 5; optional int32 thread_id = 6; optional int32 process_id = 7; } // End of protos/perfetto/metrics/android/wattson_tasks_attribution.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; optional int64 tracing_started_ns = 11; optional int64 android_sdk_version = 12; optional int64 suspend_count = 13; optional int64 data_loss_count = 14; optional int64 error_count = 15; } // 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: 75 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; // If the trace contains a heap graph, output stats per heap class. optional JavaHeapClassStats java_heap_class_stats = 67; // 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; // Aggregated Android Monitor Contention metrics optional AndroidMonitorContentionAggMetric android_monitor_contention_agg = 56; optional AndroidBootMetric android_boot = 57; // Metric for AdServices module. optional AdServicesMetric ad_services_metric = 58; optional SysuiNotifShadeListBuilderMetric sysui_notif_shade_list_builder_metric = 59; optional SysuiUpdateNotifOnUiModeChangedMetric sysui_update_notif_on_ui_mode_changed_metric = 60; // Metrics for Process starts. optional AndroidAppProcessStartsMetric android_app_process_starts = 61; // Android boot unaggregated metrics. optional AndroidBootUnagg android_boot_unagg = 62; // Android garbage collection metrics optional AndroidGarbageCollectionUnaggMetric android_garbage_collection_unagg = 63; // Multiuser - metrics for switching users. // Specific for Android Auto optional AndroidAutoMultiuserMetric android_auto_multiuser = 64; // All blocking calls (e.g. binder calls) for a trace. optional AndroidBlockingCallsUnagg android_blocking_calls_unagg = 65; // Android OOM unaggregated metrics. optional AndroidOomAdjusterMetric android_oom_adjuster = 66; // Android Broadcasts aggregated metrics optional AndroidBroadcastsMetric android_broadcasts = 68; // Android Wattson rail estimate for each app startup. optional AndroidWattsonTimePeriodMetric wattson_app_startup_rails = 69; // Android Wattson rail estimate for duration of entire trace. optional AndroidWattsonTimePeriodMetric wattson_trace_rails = 70; // Android Anomaly metric optional AndroidAnomalyMetric android_anomaly = 71; // Android Wattson app startup metrics. optional AndroidWattsonTasksAttributionMetric wattson_trace_threads = 72; // Android Wattson thread attribution during markers time window. optional AndroidWattsonTasksAttributionMetric wattson_markers_threads = 73; // Android Wattson estimate during markers time window. optional AndroidWattsonTimePeriodMetric wattson_markers_rails = 74; // Android // 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