blob: 20801684d672f74347ddca68cce4014e853b9677 [file] [log] [blame]
Rahul Ravikumar05336002019-10-14 15:04:32 -07001/*
2 * Copyright 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.webkit;
18
19import android.annotation.IntDef;
20import android.annotation.NonNull;
21
22import java.lang.annotation.Retention;
23import java.lang.annotation.RetentionPolicy;
24import java.util.ArrayList;
25import java.util.Collection;
26import java.util.List;
27
28/**
29 * Holds tracing configuration information and predefined settings.
30 */
31public class TracingConfig {
32
33 private @PredefinedCategories int mPredefinedCategories;
34 private final List<String> mCustomIncludedCategories = new ArrayList<String>();
35 private @TracingMode int mTracingMode;
36
37 /** @hide */
38 @IntDef(flag = true, value = {CATEGORIES_NONE, CATEGORIES_ALL, CATEGORIES_ANDROID_WEBVIEW,
39 CATEGORIES_WEB_DEVELOPER, CATEGORIES_INPUT_LATENCY, CATEGORIES_RENDERING,
40 CATEGORIES_JAVASCRIPT_AND_RENDERING, CATEGORIES_FRAME_VIEWER})
41 @Retention(RetentionPolicy.SOURCE)
42 public @interface PredefinedCategories {}
43
44 /**
45 * Indicates that there are no predefined categories.
46 */
47 public static final int CATEGORIES_NONE = 0;
48
49 /**
50 * Predefined set of categories, includes all categories enabled by default in chromium.
51 * Use with caution: this setting may produce large trace output.
52 */
53 public static final int CATEGORIES_ALL = 1 << 0;
54
55 /**
56 * Predefined set of categories typically useful for analyzing WebViews.
57 * Typically includes "android_webview" and "Java" categories.
58 */
59 public static final int CATEGORIES_ANDROID_WEBVIEW = 1 << 1;
60
61 /**
62 * Predefined set of categories typically useful for web developers.
63 * Typically includes "blink", "compositor", "renderer.scheduler" and "v8" categories.
64 */
65 public static final int CATEGORIES_WEB_DEVELOPER = 1 << 2;
66
67 /**
68 * Predefined set of categories for analyzing input latency issues.
69 * Typically includes "input", "renderer.scheduler" categories.
70 */
71 public static final int CATEGORIES_INPUT_LATENCY = 1 << 3;
72
73 /**
74 * Predefined set of categories for analyzing rendering issues.
75 * Typically includes "blink", "compositor" and "gpu" categories.
76 */
77 public static final int CATEGORIES_RENDERING = 1 << 4;
78
79 /**
80 * Predefined set of categories for analyzing javascript and rendering issues.
81 * Typically includes "blink", "compositor", "gpu", "renderer.scheduler" and "v8" categories.
82 */
83 public static final int CATEGORIES_JAVASCRIPT_AND_RENDERING = 1 << 5;
84
85 /**
86 * Predefined set of categories for studying difficult rendering performance problems.
87 * Typically includes "blink", "compositor", "gpu", "renderer.scheduler", "v8" and
88 * some other compositor categories which are disabled by default.
89 */
90 public static final int CATEGORIES_FRAME_VIEWER = 1 << 6;
91
92 /** @hide */
93 @IntDef({RECORD_UNTIL_FULL, RECORD_CONTINUOUSLY})
94 @Retention(RetentionPolicy.SOURCE)
95 public @interface TracingMode {}
96
97 /**
98 * Record trace events until the internal tracing buffer is full.
99 *
100 * Typically the buffer memory usage is larger than {@link #RECORD_CONTINUOUSLY}.
101 * Depending on the implementation typically allows up to 256k events to be stored.
102 */
103 public static final int RECORD_UNTIL_FULL = 0;
104
105 /**
106 * Record trace events continuously using an internal ring buffer. Default tracing mode.
107 *
108 * Overwrites old events if they exceed buffer capacity. Uses less memory than the
109 * {@link #RECORD_UNTIL_FULL} mode. Depending on the implementation typically allows
110 * up to 64k events to be stored.
111 */
112 public static final int RECORD_CONTINUOUSLY = 1;
113
114 /**
115 * @hide
116 */
117 public TracingConfig(@PredefinedCategories int predefinedCategories,
118 @NonNull List<String> customIncludedCategories,
119 @TracingMode int tracingMode) {
120 mPredefinedCategories = predefinedCategories;
121 mCustomIncludedCategories.addAll(customIncludedCategories);
122 mTracingMode = tracingMode;
123 }
124
125 /**
126 * Returns a bitmask of the predefined category sets of this configuration.
127 *
128 * @return Bitmask of predefined category sets.
129 */
130 @PredefinedCategories
131 public int getPredefinedCategories() {
132 return mPredefinedCategories;
133 }
134
135 /**
136 * Returns the list of included custom category patterns for this configuration.
137 *
138 * @return Empty list if no custom category patterns are specified.
139 */
140 @NonNull
141 public List<String> getCustomIncludedCategories() {
142 return mCustomIncludedCategories;
143 }
144
145 /**
146 * Returns the tracing mode of this configuration.
147 *
148 * @return The tracing mode of this configuration.
149 */
150 @TracingMode
151 public int getTracingMode() {
152 return mTracingMode;
153 }
154
155 /**
156 * Builder used to create {@link TracingConfig} objects.
157 * <p>
158 * Examples:
159 * <pre class="prettyprint">
160 * // Create a configuration with default options: {@link #CATEGORIES_NONE},
161 * // {@link #RECORD_CONTINUOUSLY}.
162 * <code>new TracingConfig.Builder().build()</code>
163 *
164 * // Record trace events from the "web developer" predefined category sets.
165 * // Uses a ring buffer (the default {@link #RECORD_CONTINUOUSLY} mode) for
166 * // internal storage during tracing.
167 * <code>new TracingConfig.Builder().addCategories(CATEGORIES_WEB_DEVELOPER).build()</code>
168 *
169 * // Record trace events from the "rendering" and "input latency" predefined
170 * // category sets.
171 * <code>new TracingConfig.Builder().addCategories(CATEGORIES_RENDERING,
172 * CATEGORIES_INPUT_LATENCY).build()</code>
173 *
174 * // Record only the trace events from the "browser" category.
175 * <code>new TracingConfig.Builder().addCategories("browser").build()</code>
176 *
177 * // Record only the trace events matching the "blink*" and "renderer*" patterns
178 * // (e.g. "blink.animations", "renderer_host" and "renderer.scheduler" categories).
179 * <code>new TracingConfig.Builder().addCategories("blink*","renderer*").build()</code>
180 *
181 * // Record events from the "web developer" predefined category set and events from
182 * // the "disabled-by-default-v8.gc" category to understand where garbage collection
183 * // is being triggered. Uses a limited size buffer for internal storage during tracing.
184 * <code>new TracingConfig.Builder().addCategories(CATEGORIES_WEB_DEVELOPER)
185 * .addCategories("disabled-by-default-v8.gc")
186 * .setTracingMode(RECORD_UNTIL_FULL).build()</code>
187 * </pre>
188 */
189 public static class Builder {
190 private @PredefinedCategories int mPredefinedCategories = CATEGORIES_NONE;
191 private final List<String> mCustomIncludedCategories = new ArrayList<String>();
192 private @TracingMode int mTracingMode = RECORD_CONTINUOUSLY;
193
194 /**
195 * Default constructor for Builder.
196 */
197 public Builder() {}
198
199 /**
200 * Build {@link TracingConfig} using the current settings.
201 *
202 * @return The {@link TracingConfig} with the current settings.
203 */
204 public TracingConfig build() {
205 return new TracingConfig(mPredefinedCategories, mCustomIncludedCategories,
206 mTracingMode);
207 }
208
209 /**
210 * Adds predefined sets of categories to be included in the trace output.
211 *
212 * A predefined category set can be one of {@link #CATEGORIES_NONE},
213 * {@link #CATEGORIES_ALL}, {@link #CATEGORIES_ANDROID_WEBVIEW},
214 * {@link #CATEGORIES_WEB_DEVELOPER}, {@link #CATEGORIES_INPUT_LATENCY},
215 * {@link #CATEGORIES_RENDERING}, {@link #CATEGORIES_JAVASCRIPT_AND_RENDERING} or
216 * {@link #CATEGORIES_FRAME_VIEWER}.
217 *
218 * @param predefinedCategories A list or bitmask of predefined category sets.
219 * @return The builder to facilitate chaining.
220 */
221 public Builder addCategories(@PredefinedCategories int... predefinedCategories) {
222 for (int categorySet : predefinedCategories) {
223 mPredefinedCategories |= categorySet;
224 }
225 return this;
226 }
227
228 /**
229 * Adds custom categories to be included in trace output.
230 *
231 * Note that the categories are defined by the currently-in-use version of WebView. They
232 * live in chromium code and are not part of the Android API.
233 * See <a href="https://www.chromium.org/developers/how-tos/trace-event-profiling-tool">
234 * chromium documentation on tracing</a> for more details.
235 *
236 * @param categories A list of category patterns. A category pattern can contain wildcards,
237 * e.g. "blink*" or full category name e.g. "renderer.scheduler".
238 * @return The builder to facilitate chaining.
239 */
240 public Builder addCategories(String... categories) {
241 for (String category: categories) {
242 mCustomIncludedCategories.add(category);
243 }
244 return this;
245 }
246
247 /**
248 * Adds custom categories to be included in trace output.
249 *
250 * Same as {@link #addCategories(String...)} but allows to pass a Collection as a parameter.
251 *
252 * @param categories A list of category patterns.
253 * @return The builder to facilitate chaining.
254 */
255 public Builder addCategories(Collection<String> categories) {
256 mCustomIncludedCategories.addAll(categories);
257 return this;
258 }
259
260 /**
261 * Sets the tracing mode for this configuration.
262 * When tracingMode is not set explicitly, the default is {@link #RECORD_CONTINUOUSLY}.
263 *
264 * @param tracingMode The tracing mode to use, one of {@link #RECORD_UNTIL_FULL} or
265 * {@link #RECORD_CONTINUOUSLY}.
266 * @return The builder to facilitate chaining.
267 */
268 public Builder setTracingMode(@TracingMode int tracingMode) {
269 mTracingMode = tracingMode;
270 return this;
271 }
272 }
273
274}