A Linux build machine capable of building Chrome for Linux. Other (Mac/Windows) platforms are not supported for Android.
First, check out and install the depot_tools package.
Then, if you have no existing checkout, create your source directory and get the code:
mkdir ~/chromium && cd ~/chromium fetch --nohooks android # This will take 30 minutes on a fast connection
If you have an existing Linux checkout, you can add Android support by appending
target_os = ['android'] to your .gclient file (in the directory above src):
cat > .gclient <<EOF solutions = [ ...existing stuff in here... ] target_os = [ 'android' ] # Add this to get Android stuff checked out. EOF
Then run gclient sync to get the Android stuff checked out:
gclient sync --nohooks -r <lkgr-sha1>
This is not needed for a typical developer workflow; only for one-time builds of Chromium.
Create a build directory and set the build flags with:
gn args out/Default
You can replace out/Default with another name you choose inside the out directory.
Also be aware that some scripts (e.g. tombstones.py, adb_gdb.py) require you to set
This command will bring up your editor with the GN build args. In this file add:
target_os = "android" target_cpu = "arm" # (default) is_debug = true # (default) # Other args you may want to set: is_component_build = true is_clang = true symbol_level = 1 # Faster build with fewer symbols. -g1 rather than -g2 enable_incremental_javac = true # Much faster; experimental
You can also specify
target_cpu values of “x86” and “mipsel”. Re-run gn args on that directory to edit the flags in the future. See the GN build configuration page for other flags you may want to set.
Update the system packages required to build by running:
Make also sure that OpenJDK 1.7 is selected as default:
sudo update-alternatives --config javac
sudo update-alternatives --config java
sudo update-alternatives --config javaws
sudo update-alternatives --config javap
sudo update-alternatives --config jar
sudo update-alternatives --config jarsigner
adb_install_apk.py script below fails, make sure aapt is in your PATH. If not, add aapt's path to your PATH environment variable (it should be
Prepare the environment:
Make sure your Android device is plugged in via USB, and USB Debugging is enabled.
To enable USB Debugging:
You may also be prompted to allow access to your PC once your device is plugged in.
You can check if the device is connected by running:
Which prints a list of connected devices. If not connected, try unplugging and reattaching your device.
ninja -C out/Release chrome_public_apk
And deploy it to your Android device:
CHROMIUM_OUTPUT_DIR=$gndir build/android/adb_install_apk.py $gndir/apks/ChromePublic.apk # for gn.
The app will appear on the device as “Chromium”.
Wraps the content module (but not the /chrome embedder). See http://www.chromium.org/developers/content-module for details on the content module and content shell.
ninja -C out/Release content_shell_apk build/android/adb_install_apk.py out/Release/apks/ContentShell.apk
this will build and install an Android apk under
Release is the name of your build directory.)
If you use custom out dir instead of standard out/ dir, use CHROMIUM_OUT_DIR env.
Android WebView is a system framework component. Since Android KitKat, it is implemented using Chromium code (based off the content module). It is possible to test modifications to WebView using a simple test shell. The WebView shell is a view with a URL bar at the top (see code) and is independent of the WebView implementation in the Android system ( the WebView shell is essentially a standalone unbundled app). As drawback, the shell runs in non-production rendering mode only.
ninja -C out/Release android_webview_apk build/android/adb_install_apk.py out/Release/apks/AndroidWebView.apk
If, instead, you want to build the complete Android WebView framework component and test the effect of your chromium changes in other Android app using the WebView, you should follow the Android AOSP + chromium WebView instructions
Set command line flags if necessary.
For Content shell:
For Chrome public:
For Android WebView shell:
Logging is often the easiest way to understand code flow. In C++ you can print log statements using the LOG macro or printf(). In Java, you can print log statements using android.util.Log:
Log.d("sometag", "Reticulating splines progress = " + progress);
You can see these log statements using adb logcat:
adb logcat...01-14 11:08:53.373 22693 23070 D sometag: Reticulating splines progress = 0.99
You can debug Java or C++ code. To debug C++ code, use one of the following commands:
build/android/adb_gdb_content_shell build/android/adb_gdb_chrome_public build/android/adb_gdb_android_webview_shell http://example.com
See Debugging Chromium on Android for more on debugging, including how to debug Java code.
For information on running tests, see android_test_instructions.md.
GN's “incremental install” uses reflection and side-loading to speed up the edit & deploy cycle (normally < 10 seconds).
is_component_build = truein your GN args
_incrementaltargets defined (e.g.
Here's an example:
ninja -C out/Default chrome_public_apk_incremental out/Default/bin/install_chrome_public_apk_incremental -v
For gunit tests (note that run_*_incremental automatically add --fast-local-dev when calling test_runner.py):
ninja -C out/Default base_unittests_incremental out/Default/bin/run_base_unittests_incremental
For instrumentation tests:
ninja -C out/Default chrome_public_test_apk_incremental out/Default/bin/run_chrome_public_test_apk_incremental
out/Default/bin/install_chrome_public_apk_incremental -v --uninstall
These instructions are only necessary for Chrome 51 and earlier.
In the case where you want to modify the native code for an existing release of Chrome for Android (v25+) you can do the following steps. Note that in order to get your changes into the official release, you'll need to send your change for a codereview using the regular process for committing code to chromium.