| # System WebView Shell | |
| [TOC] | |
|  | |
| WebView team maintains a "shell"—a thin interface over the WebView | |
| APIs—to exercise WebView functionality. The System WebView Shell (AKA | |
| "shell browser," "WebView shell") is a standalone app implemented [in | |
| chromium](/android_webview/tools/system_webview_shell/). While often used for | |
| manual testing, we also use the shell for automated tests (see our [layout and | |
| page cycler tests](./test-instructions.md#layout-tests-and-page-cycler-tests)). | |
| *** note | |
| This relies on the WebView installed on the system. So if you're trying to | |
| verify local changes to WebView, or run against a specific WebView build, you | |
| must **install WebView first.** | |
| *** | |
| *** promo | |
| **Tip:** the shell displays the WebView version (the corresponding [chromium version | |
| number](https://www.chromium.org/developers/version-numbers)) in the title bar | |
| at the top. This can be helpful for checking which WebView version is installed | |
| & selected on the device. | |
| *** | |
| *** note | |
| This is *not* a production quality browser and does not implement suitable | |
| security UI to be used for anything other than testing WebView. This should not | |
| be shipped anywhere or used as the basis for implementing a browser. | |
| *** | |
| ## Setting up the build | |
| WebView shell only requires `target_os = "android"`. The simplest option is to | |
| just reuse the same out/ folder and GN args you would normally use for WebView | |
| or Chrome for Android. | |
| *** note | |
| **For the emulator:** the emulator comes with WebView shell preinstalled with a | |
| different signing key, so installation will fail with | |
| `INSTALL_FAILED_UPDATE_INCOMPATIBLE: Package ... signatures do not match | |
| previously installed version`. You can workaround this in your GN args with | |
| `system_webview_shell_package_name = "org.chromium.my_webview_shell"`. | |
| Your local build will install alongside the preinstalled WebView shell. You may | |
| hide the preinstalled shell by running `adb root` followed by `adb shell pm | |
| disable org.chromium.webview_shell` in your terminal (copy-paste the command | |
| as-written, **don't** use the package name from the GN arg above). | |
| *** | |
| ## Building the shell | |
| ```sh | |
| $ autoninja -C out/Default system_webview_shell_apk | |
| ``` | |
| ## Installing the shell | |
| ```sh | |
| $ out/Default/bin/system_webview_shell_apk install | |
| ``` | |
| ## Running the shell | |
| ```sh | |
| # Launch a URL from the commandline, or open the app from the app launcher | |
| $ out/Default/bin/system_webview_shell_apk launch "https://www.google.com/" | |
| # For more commands: | |
| $ out/Default/bin/system_webview_shell_apk --help | |
| ``` | |
| *** note | |
| **Note:** `system_webview_shell_apk` does not support modifying CLI flags. See | |
| https://crbug.com/959425. Instead, you should modify WebView's flags by | |
| following [commandline-flags.md](./commandline-flags.md). | |
| *** | |
| ## Prebuilt APKs | |
| We maintain a **public** archive of prebuilt WebView shell APKs. This saves you | |
| the effort of setting up a chromium checkout just for the sake of compiling this | |
| test app. You can download a prebuilt APK from this cloud storage bucket: | |
| https://storage.googleapis.com/chromium-browser-snapshots/index.html?prefix=Android/ | |
| 1. Click on the "name" column header **twice**. This will force the page to sort | |
| the newest builds toward the top. Click the folder with the largest number, | |
| ignoring the `LAST_CHANGE` and `refs_heads_main-*/` folders. | |
| * Your WebView shell version **does not** need to match your device's | |
| WebView version. We recommend using the latest WebView shell build | |
| regardless of your WebView version to make sure you have the latest | |
| features and bug fixes of the shell app itself. | |
| 1. Click `chrome-android.zip` to download the archived APKs. Unzip this and look | |
| for a file named `SystemWebViewShell.apk`. | |
| 1. Now you can install this like any other APK: | |
| ```sh | |
| # Install adb if it's not already installed: | |
| $ which adb || sudo apt install adb | |
| # Replace this path with the path to your downloaded APK | |
| $ adb install -d -r ~/Downloads/chrome-android/SystemWebViewShell.apk | |
| ``` | |
| *** note | |
| **Note:** on the Android emulator, this may fail to install and print the | |
| `INSTALL_FAILED_UPDATE_INCOMPATIBLE: Package ... signatures do not match | |
| previously installed version` error message. This may require switching to a | |
| physical device or compiling the WebView shell from source (see the | |
| troubleshooting steps below). | |
| *** | |
| ## Troubleshooting | |
| ### INSTALL\_FAILED\_UPDATE\_INCOMPATIBLE: Package ... signatures do not match previously installed version | |
| This may be happening because the shell is preinstalled on your device (ex. this | |
| is the case on all emulators). **The easiest way** to workaround this is to | |
| [change the shell's package name in a local build](#building-for-the-emulator). | |
| If you don't want to (or can't) change the package name, then you may be able to | |
| modify your device's system image. See the [manual steps for removing system | |
| apps](removing-system-apps.md) and replace **com.google.android.webview** with | |
| **org.chromium.webview_shell**. |