Home | History | Annotate | Download | only in webkit
      1 /*
      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 
     17 package android.webkit;
     18 
     19 import android.annotation.IntDef;
     20 import android.annotation.NonNull;
     21 
     22 import java.lang.annotation.Retention;
     23 import java.lang.annotation.RetentionPolicy;
     24 import java.util.ArrayList;
     25 import java.util.Collection;
     26 import java.util.List;
     27 
     28 /**
     29  * Holds tracing configuration information and predefined settings.
     30  */
     31 public 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 }
    275