aboutsummaryrefslogtreecommitdiff
path: root/protos/perfetto/metrics/android/startup_metric.proto
blob: 54bf1d74a72670a9f22f058c623deb8fa3e0abbc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
/*
 * 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;
  }

  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: 31.
  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;
    // Deprecated 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;
  }

  // Metrics with information about the status of odex files and the outcome
  // of the loading process.
  // Multiple files might be loaded for a single startup. Platform might also
  // decide to discard an odex file and instead load a fallback, for example
  // in case the OS or apk were updated.
  message OptimizationStatus {
    optional string odex_status = 1;
    optional string compilation_filter = 2;
    optional string compilation_reason = 3;
    optional string location = 4;
  }

  // Contains timestamps of important events which occurred during the
  // startup.
  message EventTimestamps {
    optional int64 intent_received = 1;
    optional int64 first_frame = 2;
  }

  // Next id: 15
  message Startup {
    // Random id uniquely identifying an app startup in this trace.
    optional uint32 startup_id = 1;

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

    // Conntains information about the status of odex files.
    repeated OptimizationStatus optimization_status = 12;

    reserved 10;
  }

  repeated Startup startup = 1;
}