| # Commandline flags | |
| ## Can I apply commandline flags on my device? | |
| *** note | |
| **Note:** this guide only applies to userdebug/eng devices and emulators. Most | |
| users and app developers **do not** have debuggable devices, and therefore | |
| cannot follow this guide. | |
| If you need to toggle flags on production Android devices, you can use [WebView | |
| DevTools](developer-ui.md). | |
| *** | |
| You can check which Android image you have on your device with the following: | |
| ```sh | |
| # If you don't have `adb` in your path, you can source this file to use | |
| # the copy from chromium's Android SDK. | |
| $ source build/android/envsetup.sh | |
| # If this outputs "userdebug" or "eng" then you can apply flags following this | |
| # guide. If it outputs "user" then you can only use WebView DevTools. | |
| $ adb shell getprop ro.build.type | |
| userdebug | |
| ``` | |
| If the above outputs "user," then you have two options: | |
| * Try using [WebView DevTools](developer-ui.md) to toggle flags (also works on | |
| userdebug and eng devices) | |
| * Reflash your device or create a debuggable emulator (see [device | |
| setup](device-setup.md)) | |
| ## Overview | |
| WebView (and Chromium in general) has two different types of "commandline | |
| flags:" | |
| * **Commandline Switches** enable debugging functionality. These look like | |
| `--name-of-switch`. | |
| * **Feature Flags** configure WebView to enable or disable an in-development | |
| project or enhancement. These look like `NameOfFeature`. | |
| Before applying commandline flags, you should understand which specific flags | |
| you want to flip and whether each is a Commandline Switch or Feature Flag. | |
| Then follow the steps below. | |
| ## Applying Commandline Switches {#commandline-switches} | |
| <!-- Note: keep this language consistent with the section below. Search for | |
| "force stop and restart" --> | |
| WebView reads flags from a specific file on the device as part of the startup | |
| sequence. Swiping an app away in the recent app switcher is usually sufficient | |
| to restart it, but if flags are not being picked up, you must **force stop and | |
| restart the WebView-based app** (`adb shell am force-stop <package>` or via | |
| App Info > Force Stop). | |
| WebView always looks for the same file on the device | |
| (`/data/local/tmp/webview-command-line`), regardless of which package is the | |
| [the WebView provider](prerelease.md). | |
| ### Python script (recommended) | |
| The simplest way to set WebView flags is with the dedicated python script. This | |
| works regardless of which package is the WebView provider. **Note:** this script | |
| will overwrite any Commandline Switches or Feature Flags which had previously | |
| been applied. | |
| ```sh | |
| # Overwrite flags (supports multiple) | |
| build/android/adb_system_webview_command_line --highlight-all-webviews --force-enable-metrics-reporting | |
| # Clear flags | |
| build/android/adb_system_webview_command_line "" | |
| # Print flags | |
| build/android/adb_system_webview_command_line | |
| ``` | |
| ### Generated Wrapper Script | |
| If you have a locally compiled APK, you may instead set flags using the | |
| Generated Wrapper Script like so: | |
| ```sh | |
| autoninja -C out/Default system_webview_apk | |
| # Overwrite flags (supports multiple) | |
| out/Default/bin/system_webview_apk argv --args='--highlight-all-webviews --force-enable-metrics-reporting' | |
| # Clear flags | |
| out/Default/bin/system_webview_apk argv --args='' | |
| # Print flags | |
| out/Default/bin/system_webview_apk argv | |
| ``` | |
| ### Manual | |
| Or, you can use the `adb` in your `$PATH` like so: | |
| ```sh | |
| FLAG_FILE=/data/local/tmp/webview-command-line | |
| # Overwrite flags (supports multiple). The first token is ignored. We use '_' | |
| # as a convenient placeholder, but any token is acceptable. | |
| adb shell "echo '_ --highlight-all-webviews --force-enable-metrics-reporting' > ${FLAG_FILE}" | |
| # Clear flags | |
| adb shell "rm ${FLAG_FILE}" | |
| # Print flags | |
| adb shell "cat ${FLAG_FILE}" | |
| ``` | |
| ## Verifying flags are applied | |
| You can add the `--webview-verbose-logging` flag, which tells WebView to dump | |
| its full commandline and variations state to logs during startup. You can filter | |
| device logs with: | |
| ```shell | |
| adb logcat | grep -iE 'Active field trial|WebViewCommandLine' | |
| ``` | |
| ## Applying Feature Flags | |
| [Feature Flags](/base/feature_list.h) (also stylized as `base::Feature` or | |
| `BASE_FEATURE`) are Chromium's mechanism for toggling off-by-default code paths. | |
| While debugging flags are also off-by-default, Feature Flags typically guard | |
| soon-to-launch product enhancements until they're tested enough for field trials | |
| or public launch, at which point the Feature Flag is removed and the legacy code | |
| path is no longer supported and removed from the codebase. On the other hand, | |
| debugging flags don't "launch," as they're typically only helpful for debugging | |
| issues. | |
| WebView supports the same syntax for toggling Feature Flags as the rest of | |
| chromium: `--enable-features=feature1,feature2` and | |
| `--disable-features=feature3,feature4`. You can apply `--enable-features` and | |
| `--disable-features` like any other flags, per the steps above. Please consult | |
| [`base/feature_list.h`](/base/feature_list.h) for details. Examples of toggling | |
| Feature Flags: | |
| ```sh | |
| # Enable a single Feature Flag: | |
| build/android/adb_system_webview_command_line --enable-features=WebViewTestFeature | |
| # Enable multiple Feature Flags: | |
| build/android/adb_system_webview_command_line --enable-features=WebViewTestFeature,WebViewBrotliSupport | |
| # Enable and disable Feature Flags: | |
| build/android/adb_system_webview_command_line --enable-features=WebViewTestFeature --disable-features=WebViewBrotliSupport | |
| # Use Commandline Switches and Feature Flags at the same time: | |
| build/android/adb_system_webview_command_line --highlight-all-webviews --enable-features=WebViewTestFeature | |
| ``` | |
| As with [Commandline Switches](#commandline-switches), we support multiple tools | |
| for toggling Feature Flags (Python script, Generated Wrapper Script, manual). | |
| <!-- Note: keep this language consistent with the section above. Search for | |
| "force stop and restart" --> | |
| As before, swiping an app away in the recent app switcher is usually sufficient | |
| to restart it, but if flags are not being picked up, you must **force stop and | |
| restart the WebView-based app** (`adb shell am force-stop <package>` or via | |
| App Info > Force Stop). | |
| ## Finding Feature Flags and Commandline Switches | |
| WebView supports toggling any Commandline Switches or Feature Flags supported in | |
| any layer we depend on (//base, //content, etc.). For more details on Chromium's | |
| layer architecture, see [this | |
| diagram](https://www.chromium.org/developers/content-module) (replace "chrome" | |
| with "android\_webview"). Although we support toggling these flags, not all | |
| flags will have an effect when toggled, nor do we guarantee WebView functions | |
| correctly when the flag is toggled. | |
| Some interesting Commandline Switches: | |
| * `--highlight-all-webviews`: highlight the entire contents of all WebViews, to | |
| quickly identify which app content is rendered by a WebView vs. native Views. | |
| * `--show-composited-layer-borders`: highlight rendering layers, to identify | |
| possible graphics issues. | |
| * `--force-enable-metrics-reporting`: enable UMA metrics reporting (does not | |
| override app opt-out) | |
| * `--finch-seed-expiration-age=0 --finch-seed-min-update-period=0 --finch-seed-min-download-period=0 --finch-seed-ignore-pending-download`: always request a new finch seed when an app starts | |
| WebView also defines its own Commandline Switches and Feature Flags: | |
| * C++ Commandline Switches are defined in | |
| [`aw_switches.cc`](/android_webview/common/aw_switches.cc). We use | |
| [`java_cpp_strings`](/docs/android_accessing_cpp_switches_in_java.md) to | |
| automatically generate Java switch constants from the C++ switches (see | |
| [`AwSwitches.java`](https://source.chromium.org/chromium/chromium/src/+/main:out/android-Debug/gen/android_webview/common_java/generated_java/input_srcjars/org/chromium/android_webview/common/AwSwitches.java)). | |
| * C++ Feature Flags are defined in | |
| [`aw_features.cc`](/android_webview/common/aw_features.cc). We use | |
| [`java_cpp_features`](/docs/android_accessing_cpp_features_in_java.md) to | |
| automatically generate Java constants from the C++ Feature Flags (see | |
| [`AwFeatures.java`](https://source.chromium.org/chromium/chromium/src/+/main:out/android-Debug/gen/android_webview/common_java/generated_java/input_srcjars/org/chromium/android_webview/common/AwFeatures.java)). | |
| ## Implementation | |
| See [CommandLineUtil.java](https://cs.chromium.org/chromium/src/android_webview/java/src/org/chromium/android_webview/common/CommandLineUtil.java). |