| /* |
| * Copyright (C) 2019 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| syntax = "proto2"; |
| |
| package perfetto.protos; |
| |
| import "protos/perfetto/metrics/android/process_metadata.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: 33. |
| message ToFirstFrame { |
| // The duration between the intent received and first frame. |
| optional int64 dur_ns = 1; |
| optional double dur_ms = 17; |
| |
| // Breakdown of time to first frame by task state for the main thread of |
| // the process starting up. |
| optional TaskStateBreakdown main_thread_by_task_state = 2; |
| |
| // The mcycles taken by this startup across all CPUs (broken down by core |
| // type). |
| optional McyclesByCoreType mcycles_by_core_type = 26; |
| |
| // In this timespan, how many processes (apart from the main activity) were |
| // spawned. |
| optional uint32 other_processes_spawned_count = 3; |
| |
| // Total time spent in activity manager between the initial intent |
| // and the end of the activity starter. |
| optional Slice time_activity_manager = 4; |
| |
| // The following slices follow the typical steps post-fork. |
| optional Slice time_activity_thread_main = 5; |
| optional Slice time_bind_application = 6; |
| optional Slice time_activity_start = 7; |
| optional Slice time_activity_resume = 8; |
| optional Slice time_activity_restart = 21; |
| optional Slice time_choreographer = 9; |
| optional Slice time_inflate = 22; |
| optional Slice time_get_resources = 23; |
| |
| // If we are starting a new process, record the duration from the |
| // intent being received to the time we call the zygote. |
| optional Slice time_before_start_process = 10; |
| |
| // The actual duration of the process start (based on the zygote slice). |
| optional Slice time_during_start_process = 11; |
| |
| optional Slice to_post_fork = 18; |
| optional Slice to_activity_thread_main = 19; |
| optional Slice to_bind_application = 20; |
| |
| optional Slice time_post_fork = 16; |
| |
| // The total time spent on opening dex files. |
| optional Slice time_dex_open = 24; |
| // Total time spent verifying classes during app startup. |
| optional Slice time_verify_class = 25; |
| |
| // Number of methods that were compiled by JIT during app startup. |
| optional uint32 jit_compiled_methods = 27; |
| |
| // Time spent running CPU on jit thread pool. |
| optional Slice time_jit_thread_pool_on_cpu = 28; |
| |
| // Time spent on garbage collection. |
| optional Slice time_gc_total = 29; |
| optional Slice time_gc_on_cpu = 30; |
| |
| // Time spent in lock contention on the main thread of the process being |
| // started up. This includes *all* types of lock contention not just monitor |
| // contention. |
| optional Slice time_lock_contention_thread_main = 31; |
| |
| // Time spent in monitor lock contention on the main thread of the |
| // process being started up. This will be a subset of the time counted by |
| // |time_lock_contention_thread_main|. |
| optional Slice time_monitor_contention_thread_main = 32; |
| |
| // Removed: was other_process_to_activity_cpu_ratio. |
| reserved 12; |
| |
| // Removed: was uint32 versions of to_post_fork, to_activity_thread_main and |
| // to_bind_application. |
| reserved 13, 14, 15; |
| } |
| |
| // Metrics about startup which were developed by looking at experiments using |
| // high-speed cameras (HSC). |
| message HscMetrics { |
| // The duration of the full "startup" as defined by HSC tests. |
| optional Slice full_startup = 1; |
| } |
| |
| message Activity { |
| optional string name = 1; |
| optional string method = 2; |
| optional int64 ts_method_start = 4; |
| |
| // Field 3 contained Slice with a sum of durations for matching slices. |
| reserved 3; |
| } |
| |
| message BinderTransaction { |
| optional Slice duration = 1; |
| optional string thread = 2; |
| optional string destination_thread = 3; |
| optional string destination_process = 4; |
| // From |
| // https://cs.android.com/android/platform/superproject/+/master:external/perfetto/protos/perfetto/trace/ftrace/binder.proto;l=15;drc=7b6a788162a30802f4c9d8d7a30a54e25edd30f1 |
| optional string flags = 5; |
| // From |
| // https://cs.android.com/android/platform/superproject/+/master:external/perfetto/protos/perfetto/trace/ftrace/binder.proto;l=14;drc=7b6a788162a30802f4c9d8d7a30a54e25edd30f1 |
| optional string code = 6; |
| // From |
| // https://cs.android.com/android/platform/superproject/+/master:external/perfetto/protos/perfetto/trace/ftrace/binder.proto;l=37;drc=7b6a788162a30802f4c9d8d7a30a54e25edd30f1 |
| optional int64 data_size = 7; |
| } |
| |
| // Metrics with information about the status of odex files and the outcome |
| // of the loading process. |
| // Multiple files might be loaded for a single startup. Platform might also |
| // decide to discard an odex file and instead load a fallback, for example |
| // in case the OS or apk were updated. |
| message OptimizationStatus { |
| optional string odex_status = 1; |
| optional string compilation_filter = 2; |
| optional string compilation_reason = 3; |
| optional string location = 4; |
| } |
| |
| // Contains the name and duration of class verification occurred during |
| // the startup. |
| message VerifyClass { |
| optional string name = 1; |
| optional int64 dur_ns = 2; |
| } |
| |
| // Contains timestamps of important events which occurred during the |
| // startup. |
| message EventTimestamps { |
| optional int64 intent_received = 1; |
| optional int64 first_frame = 2; |
| } |
| |
| // Contains information about the state of a system during the app startup. |
| // Useful to put the startup in context. |
| message SystemState { |
| // Whether the dex2oat64 process was running concurrent to the startup. |
| // Deprecated as of 10/2022. |
| optional bool dex2oat_running = 1 [deprecated=true]; |
| |
| // Whether the installd process was running concurrent to the startup. |
| // Deprecated as of 10/2022. |
| optional bool installd_running = 2 [deprecated=true]; |
| |
| // The number of broadcasts dispatched by the system during the app |
| // launch. |
| optional int64 broadcast_dispatched_count = 3; |
| |
| // The number of broadcasts received by an app or the system during the |
| // app launch. Note that multiple packages can be subscribed to the same |
| // broadcast so a single dsipatch can cause multiple packages to receive |
| // and process a broadcast. |
| optional int64 broadcast_received_count = 4; |
| |
| // The most active (i.e. consuming the most mcycles) processes during the |
| // app launch excluding the process(es) being launched. |
| // Note: the exact number of returned is an implementation detail and |
| // will likely change over time. |
| repeated string most_active_non_launch_processes = 5; |
| |
| // Duration the installd process was running concurrent to the startup. |
| optional int64 installd_dur_ns = 6; |
| // Duration the dex2oat64 process was running concurrent to the startup. |
| optional int64 dex2oat_dur_ns = 7; |
| } |
| |
| // Next id: 20 |
| message Startup { |
| // Random id uniquely identifying an app startup in this trace. |
| optional uint32 startup_id = 1; |
| |
| // Startup type (cold / warm / hot) |
| optional string startup_type = 16; |
| |
| // Name of the package launched |
| optional string package_name = 2; |
| |
| // Name of the process launched |
| optional string process_name = 3; |
| |
| // Details about the activities launched |
| repeated Activity activities = 11; |
| |
| // Details about slow binder transactions during the startup. The definition |
| // of a slow transaction is an implementation detail. |
| repeated BinderTransaction long_binder_transactions = 14; |
| |
| // Did we ask the zygote for a new process |
| optional bool zygote_new_process = 4; |
| |
| // Number of processes hosting the activity involved in the launch. |
| // This will usually be 1. If it is 0, it is indicative of a data / process |
| // error. If > 1, the process died during startup and the system respawned |
| // it. |
| optional uint32 activity_hosting_process_count = 6; |
| |
| // Contains timestamps of important events which happened during |
| // the startup. |
| optional EventTimestamps event_timestamps = 13; |
| |
| // Timing information spanning the intent received by the |
| // activity manager to the first frame drawn. |
| optional ToFirstFrame to_first_frame = 5; |
| |
| // Details about the process (uid, version, etc) |
| optional AndroidProcessMetadata process = 7; |
| |
| // Metrics about startup which were developed by looking at experiments |
| // using high-speed cameras (HSC). |
| optional HscMetrics hsc = 8; |
| |
| // The time taken in the startup from intent received to the start time |
| // of the reportFullyDrawn slice. This should be longer than the time to |
| // first frame as the application decides this after it starts rendering. |
| optional Slice report_fully_drawn = 9; |
| |
| // Contains information about the status of odex files. |
| repeated OptimizationStatus optimization_status = 12; |
| |
| // Contains information about the class verification. |
| repeated VerifyClass verify_class = 19; |
| |
| // Package name of startups running concurrent to the launch. |
| repeated string startup_concurrent_to_launch = 18; |
| |
| // Contains information about the state of the rest of the system during the |
| // startup. This is useful for getting context about why a startup might |
| // be slow beyond just what the app is doing. |
| optional SystemState system_state = 15; |
| |
| // A list of identified potential causes for slow startup. |
| // Optional. |
| repeated string slow_start_reason = 17; |
| |
| reserved 10; |
| } |
| |
| repeated Startup startup = 1; |
| } |