blob: 58017d54e65f3cac85462d46af8f15493dfa41d8 [file] [log] [blame] [view]
dpranke1a70d0c2016-12-01 02:42:291# Checking out and building Chromium for Android
2
estevenson75e9b862017-01-05 16:49:233There are instructions for other platforms linked from the
dpranke1a70d0c2016-12-01 02:42:294[get the code](get_the_code.md) page.
tfarina2c773222016-04-05 18:43:355
dpranke1a70d0c2016-12-01 02:42:296## Instructions for Google Employees
7
8Are you a Google employee? See
Eric Stevenson36459112018-07-06 20:12:389[go/building-android-chrome](https://goto.google.com/building-android-chrome)
10instead.
dpranke0ae7cad2016-11-30 07:47:5811
tfarina2c773222016-04-05 18:43:3512[TOC]
13
dpranke0ae7cad2016-11-30 07:47:5814## System requirements
tfarina2c773222016-04-05 18:43:3515
dpranke0ae7cad2016-11-30 07:47:5816* A 64-bit Intel machine running Linux with at least 8GB of RAM. More
17 than 16GB is highly recommended.
18* At least 100GB of free disk space.
19* You must have Git and Python installed already.
tfarina2c773222016-04-05 18:43:3520
dpranke0ae7cad2016-11-30 07:47:5821Most development is done on Ubuntu. Other distros may or may not work;
sdy93387fa2016-12-01 01:03:4422see the [Linux instructions](linux_build_instructions.md) for some suggestions.
tfarina2c773222016-04-05 18:43:3523
dpranke0ae7cad2016-11-30 07:47:5824Building the Android client on Windows or Mac is not supported and doesn't work.
tfarina2c773222016-04-05 18:43:3525
dpranke0ae7cad2016-11-30 07:47:5826## Install `depot_tools`
tfarina2c773222016-04-05 18:43:3527
sdy93387fa2016-12-01 01:03:4428Clone the `depot_tools` repository:
dpranke0ae7cad2016-11-30 07:47:5829
sdy93387fa2016-12-01 01:03:4430```shell
Andrew Grievec81af4a2017-07-26 18:02:1331git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
sdy93387fa2016-12-01 01:03:4432```
dpranke0ae7cad2016-11-30 07:47:5833
sdy93387fa2016-12-01 01:03:4434Add `depot_tools` to the end of your PATH (you will probably want to put this
35in your `~/.bashrc` or `~/.zshrc`). Assuming you cloned `depot_tools`
36to `/path/to/depot_tools`:
dpranke0ae7cad2016-11-30 07:47:5837
sdy93387fa2016-12-01 01:03:4438```shell
Andrew Grievec81af4a2017-07-26 18:02:1339export PATH="$PATH:/path/to/depot_tools"
sdy93387fa2016-12-01 01:03:4440```
dpranke0ae7cad2016-11-30 07:47:5841
42## Get the code
43
sdy93387fa2016-12-01 01:03:4444Create a `chromium` directory for the checkout and change to it (you can call
dpranke0ae7cad2016-11-30 07:47:5845this whatever you like and put it wherever you like, as
46long as the full path has no spaces):
47
sdy93387fa2016-12-01 01:03:4448```shell
Andrew Grievec81af4a2017-07-26 18:02:1349mkdir ~/chromium && cd ~/chromium
50fetch --nohooks android
sdy93387fa2016-12-01 01:03:4451```
dpranke0ae7cad2016-11-30 07:47:5852
53If you don't want the full repo history, you can save a lot of time by
sdy93387fa2016-12-01 01:03:4454adding the `--no-history` flag to `fetch`.
dpranke0ae7cad2016-11-30 07:47:5855
56Expect the command to take 30 minutes on even a fast connection, and many
57hours on slower ones.
58
59If you've already installed the build dependencies on the machine (from another
sdy93387fa2016-12-01 01:03:4460checkout, for example), you can omit the `--nohooks` flag and `fetch`
dpranke0ae7cad2016-11-30 07:47:5861will automatically execute `gclient runhooks` at the end.
62
sdy93387fa2016-12-01 01:03:4463When `fetch` completes, it will have created a hidden `.gclient` file and a
64directory called `src` in the working directory. The remaining instructions
65assume you have switched to the `src` directory:
dpranke0ae7cad2016-11-30 07:47:5866
sdy93387fa2016-12-01 01:03:4467```shell
Andrew Grievec81af4a2017-07-26 18:02:1368cd src
sdy93387fa2016-12-01 01:03:4469```
dpranke0ae7cad2016-11-30 07:47:5870
71### Converting an existing Linux checkout
tfarina2c773222016-04-05 18:43:3572
73If you have an existing Linux checkout, you can add Android support by
sdy93387fa2016-12-01 01:03:4474appending `target_os = ['android']` to your `.gclient` file (in the
75directory above `src`):
tfarina2c773222016-04-05 18:43:3576
sdy93387fa2016-12-01 01:03:4477```shell
Andrew Grievec81af4a2017-07-26 18:02:1378echo "target_os = [ 'android' ]" >> ../.gclient
sdy93387fa2016-12-01 01:03:4479```
tfarina2c773222016-04-05 18:43:3580
sdy93387fa2016-12-01 01:03:4481Then run `gclient sync` to pull the new Android dependencies:
tfarina2c773222016-04-05 18:43:3582
sdy93387fa2016-12-01 01:03:4483```shell
Andrew Grievec81af4a2017-07-26 18:02:1384gclient sync
sdy93387fa2016-12-01 01:03:4485```
tfarina2c773222016-04-05 18:43:3586
sdy93387fa2016-12-01 01:03:4487(This is the only difference between `fetch android` and `fetch chromium`.)
tfarina2c773222016-04-05 18:43:3588
dpranke0ae7cad2016-11-30 07:47:5889### Install additional build dependencies
tfarina2c773222016-04-05 18:43:3590
dpranke0ae7cad2016-11-30 07:47:5891Once you have checked out the code, run
tfarina2c773222016-04-05 18:43:3592
sdy93387fa2016-12-01 01:03:4493```shell
Andrew Grievec81af4a2017-07-26 18:02:1394build/install-build-deps-android.sh
sdy93387fa2016-12-01 01:03:4495```
tfarina2c773222016-04-05 18:43:3596
sdy93387fa2016-12-01 01:03:4497to get all of the dependencies you need to build on Linux, *plus* all of the
dpranke0ae7cad2016-11-30 07:47:5898Android-specific dependencies (you need some of the regular Linux dependencies
sdy93387fa2016-12-01 01:03:4499because an Android build includes a bunch of the Linux tools and utilities).
tfarina2c773222016-04-05 18:43:35100
dpranke0ae7cad2016-11-30 07:47:58101### Run the hooks
tfarinaba2792fa2016-04-07 15:50:42102
dpranke0ae7cad2016-11-30 07:47:58103Once you've run `install-build-deps` at least once, you can now run the
sdy93387fa2016-12-01 01:03:44104Chromium-specific hooks, which will download additional binaries and other
dpranke0ae7cad2016-11-30 07:47:58105things you might need:
tfarinaba2792fa2016-04-07 15:50:42106
sdy93387fa2016-12-01 01:03:44107```shell
Andrew Grievec81af4a2017-07-26 18:02:13108gclient runhooks
sdy93387fa2016-12-01 01:03:44109```
tfarinaba2792fa2016-04-07 15:50:42110
sdy93387fa2016-12-01 01:03:44111*Optional*: You can also [install API
112keys](https://www.chromium.org/developers/how-tos/api-keys) if you want your
113build to talk to some Google services, but this is not necessary for most
114development and testing purposes.
tfarinaba2792fa2016-04-07 15:50:42115
dpranke1a70d0c2016-12-01 02:42:29116## Setting up the build
tfarinaba2792fa2016-04-07 15:50:42117
Tom Bridgwatereef401542018-08-17 00:54:43118Chromium uses [Ninja](https://ninja-build.org) as its main build tool along with
119a tool called [GN](https://gn.googlesource.com/gn/+/master/docs/quick_start.md)
120to generate `.ninja` files. You can create any number of *build directories*
121with different configurations. To create a build directory which builds Chrome
122for Android, run:
tfarinaba2792fa2016-04-07 15:50:42123
sdy93387fa2016-12-01 01:03:44124```shell
Andrew Grievec81af4a2017-07-26 18:02:13125gn gen --args='target_os="android"' out/Default
sdy93387fa2016-12-01 01:03:44126```
dpranke0ae7cad2016-11-30 07:47:58127
sdy93387fa2016-12-01 01:03:44128* You only have to run this once for each new build directory, Ninja will
129 update the build files as needed.
130* You can replace `Default` with another name, but
131 it should be a subdirectory of `out`.
132* For other build arguments, including release settings, see [GN build
133 configuration](https://www.chromium.org/developers/gn-build-configuration).
dpranke0ae7cad2016-11-30 07:47:58134 The default will be a debug component build matching the current host
135 operating system and CPU.
136* For more info on GN, run `gn help` on the command line or read the
137 [quick start guide](../tools/gn/docs/quick_start.md).
138
sdy93387fa2016-12-01 01:03:44139Also be aware that some scripts (e.g. `tombstones.py`, `adb_gdb.py`)
dpranke0ae7cad2016-11-30 07:47:58140require you to set `CHROMIUM_OUTPUT_DIR=out/Default`.
141
142## Build Chromium
143
144Build Chromium with Ninja using the command:
145
sdy93387fa2016-12-01 01:03:44146```shell
Max Morozf5b31fcd2018-08-10 21:55:48147autoninja -C out/Default chrome_public_apk
sdy93387fa2016-12-01 01:03:44148```
dpranke0ae7cad2016-11-30 07:47:58149
Dirk Pranke8bd55f22018-10-24 21:22:10150(`autoninja` is a wrapper that automatically provides optimal values for the
151arguments passed to `ninja`.)
Max Morozf5b31fcd2018-08-10 21:55:48152
sdy93387fa2016-12-01 01:03:44153You can get a list of all of the other build targets from GN by running `gn ls
154out/Default` from the command line. To compile one, pass the GN label to Ninja
Dirk Pranke8bd55f22018-10-24 21:22:10155with no preceding "//" (so, for `//chrome/test:unit_tests` use `autoninja -C
sdy93387fa2016-12-01 01:03:44156out/Default chrome/test:unit_tests`).
157
Andrew Grieve052376a2017-09-26 01:54:11158### Multiple Chrome APK Targets
159
160The Google Play Store allows apps to send customized `.apk` files depending on
161the version of Android running on a device. Chrome uses this feature to target
1623 different versions using 3 different ninja targets:
163
1641. `chrome_public_apk` (ChromePublic.apk)
165 * `minSdkVersion=16` (Jelly Bean).
166 * Stores libchrome.so compressed within the APK.
167 * Uses [Crazy Linker](https://cs.chromium.org/chromium/src/base/android/linker/BUILD.gn?rcl=6bb29391a86f2be58c626170156cbfaa2cbc5c91&l=9).
168 * Shipped only for Android < 21, but still works fine on Android >= 21.
1692. `chrome_modern_public_apk` (ChromeModernPublic.apk)
170 * `minSdkVersion=21` (Lollipop).
171 * Uses [Crazy Linker](https://cs.chromium.org/chromium/src/base/android/linker/BUILD.gn?rcl=6bb29391a86f2be58c626170156cbfaa2cbc5c91&l=9).
172 * Stores libchrome.so uncompressed within the APK.
173 * This APK is bigger, but the installation size is smaller since there is
174 no need to extract the .so file.
1753. `monochrome_public_apk` (MonochromePublic.apk)
176 * `minSdkVersion=24` (Nougat).
177 * Contains both WebView and Chrome within the same APK.
178 * This APK is even bigger, but much smaller than SystemWebView.apk + ChromePublic.apk.
179 * Stores libchrome.so uncompressed within the APK.
180 * Does not use Crazy Linker (WebView requires system linker).
181 * But system linker supports crazy linker features now anyways.
182
183**Note**: These instructions use `chrome_public_apk`, but either of the other
184two targets can be substituted.
185
186**Note**: These targets are actually the open-source equivalents to the
187closed-source targets that get shipped to the Play Store.
188
Andrew Grieved2ec82d2018-05-22 14:28:43189**Note**: For more in-depth differences, see [android_native_libraries.md](android_native_libraries.md).
190
Mark Pearsone9042242018-02-20 23:49:33191## Updating your checkout
192
193To update an existing checkout, you can run
194
195```shell
196$ git rebase-update
197$ gclient sync
198```
199
200The first command updates the primary Chromium source repository and rebases
201any of your local branches on top of tip-of-tree (aka the Git branch
202`origin/master`). If you don't want to use this script, you can also just use
203`git pull` or other common Git commands to update the repo.
204
205The second command syncs dependencies to the appropriate versions and re-runs
206hooks as needed.
207
dpranke0ae7cad2016-11-30 07:47:58208## Installing and Running Chromium on a device
tfarinaba2792fa2016-04-07 15:50:42209
tfarinaba2792fa2016-04-07 15:50:42210### Plug in your Android device
211
212Make sure your Android device is plugged in via USB, and USB Debugging
213is enabled.
214
215To enable USB Debugging:
216
217* Navigate to Settings \> About Phone \> Build number
218* Click 'Build number' 7 times
219* Now navigate back to Settings \> Developer Options
220* Enable 'USB Debugging' and follow the prompts
221
222You may also be prompted to allow access to your PC once your device is
223plugged in.
224
225You can check if the device is connected by running:
226
227```shell
228third_party/android_tools/sdk/platform-tools/adb devices
229```
230
231Which prints a list of connected devices. If not connected, try
232unplugging and reattaching your device.
tfarinaa68eb902016-04-12 19:43:05233
Thiemo Nagele03fb6c2018-07-31 08:29:31234### Enable apps from unknown sources
235
236Allow Android to run APKs that haven't been signed through the Play Store:
237
238* Enable 'Unknown sources' under Settings \> Security
239
240In case that setting isn't present, it may be possible to configure it via
241`adb shell` instead:
242
243```shell
244third_party/android_tools/sdk/platform-tools/adb shell settings put global verifier_verify_adb_installs 0
245```
246
tfarinaa68eb902016-04-12 19:43:05247### Build the full browser
248
tfarinaa68eb902016-04-12 19:43:05249```shell
Max Morozf5b31fcd2018-08-10 21:55:48250autoninja -C out/Default chrome_public_apk
tfarinaa68eb902016-04-12 19:43:05251```
252
253And deploy it to your Android device:
254
255```shell
Andrew Grievec81af4a2017-07-26 18:02:13256out/Default/bin/chrome_public_apk install
tfarinaa68eb902016-04-12 19:43:05257```
258
259The app will appear on the device as "Chromium".
260
261### Build Content shell
262
263Wraps the content module (but not the /chrome embedder). See
xiaoyin.l1003c0b2016-12-06 02:51:17264[https://www.chromium.org/developers/content-module](https://www.chromium.org/developers/content-module)
tfarinaa68eb902016-04-12 19:43:05265for details on the content module and content shell.
266
267```shell
Max Morozf5b31fcd2018-08-10 21:55:48268autoninja -C out/Default content_shell_apk
Andrew Grievec81af4a2017-07-26 18:02:13269out/Default/bin/content_shell_apk install
tfarinaa68eb902016-04-12 19:43:05270```
271
272this will build and install an Android apk under
Yipeng Wang613ba692017-04-25 18:24:39273`out/Default/apks/ContentShell.apk`.
tfarinaa68eb902016-04-12 19:43:05274
ntfschr29a7adab2017-03-23 21:17:08275### Build WebView
tfarinaa68eb902016-04-12 19:43:05276
xiaoyin.l1003c0b2016-12-06 02:51:17277[Android WebView](https://developer.android.com/reference/android/webkit/WebView.html)
tfarinaa68eb902016-04-12 19:43:05278is a system framework component. Since Android KitKat, it is implemented using
xiaoyin.l1003c0b2016-12-06 02:51:17279Chromium code (based off the [content module](https://dev.chromium.org/developers/content-module)).
tfarinaa68eb902016-04-12 19:43:05280
ntfschr29a7adab2017-03-23 21:17:08281If you want to build the complete Android WebView framework component and test
282the effect of your chromium changes in Android apps using WebView, you should
283follow the [Android AOSP + chromium WebView
284instructions](https://www.chromium.org/developers/how-tos/build-instructions-android-webview)
tfarinaa68eb902016-04-12 19:43:05285
286### Running
287
tfarinaa68eb902016-04-12 19:43:05288For Content shell:
289
290```shell
Andrew Grievec81af4a2017-07-26 18:02:13291out/Default/bin/content_shell_apk launch [--args='--foo --bar'] http://example.com
tfarinaa68eb902016-04-12 19:43:05292```
293
294For Chrome public:
295
296```shell
Andrew Grievec81af4a2017-07-26 18:02:13297out/Default/bin/chrome_public_apk launch [--args='--foo --bar'] http://example.com
tfarinaa68eb902016-04-12 19:43:05298```
299
tfarinaa68eb902016-04-12 19:43:05300### Logging and debugging
301
302Logging is often the easiest way to understand code flow. In C++ you can print
Andrew Grievec81af4a2017-07-26 18:02:13303log statements using the LOG macro. In Java, refer to
304[android_logging.md](android_logging.md).
tfarinaa68eb902016-04-12 19:43:05305
Andrew Grievec81af4a2017-07-26 18:02:13306You can see these log via `adb logcat`, or:
tfarinaa68eb902016-04-12 19:43:05307
308```shell
Andrew Grievec81af4a2017-07-26 18:02:13309out/Default/bin/chrome_public_apk logcat
tfarinaa68eb902016-04-12 19:43:05310```
311
Andrew Grievec81af4a2017-07-26 18:02:13312To debug C++ code, use one of the following commands:
tfarinaa68eb902016-04-12 19:43:05313
314```shell
Andrew Grievec81af4a2017-07-26 18:02:13315out/Default/bin/content_shell_apk gdb
316out/Default/bin/chrome_public_apk gdb
tfarinaa68eb902016-04-12 19:43:05317```
318
Philip Jägenstedt17f89962017-05-18 08:25:54319See [Android Debugging Instructions](android_debugging_instructions.md)
tfarinaa68eb902016-04-12 19:43:05320for more on debugging, including how to debug Java code.
321
322### Testing
323
Philip Jägenstedt17f89962017-05-18 08:25:54324For information on running tests, see [Android Test Instructions](android_test_instructions.md).
tfarinaa68eb902016-04-12 19:43:05325
Andrew Grievec81af4a2017-07-26 18:02:13326### Faster Edit/Deploy
tfarinaa68eb902016-04-12 19:43:05327
agrieveb0861f522018-10-17 19:48:36328#### GN Args
329Args that affect build speed:
330 * `is_component_build = true` *(default=`is_debug`)*
331 * What it does: Uses multiple `.so` files instead of just one (faster links)
332 * `is_java_debug = true` *(default=`is_debug`)*
333 * What it does: Disables ProGuard (slow build step)
334 * `enable_incremental_javac = true` *(default=`false`)*
335 * What it does: Tries to compile only a subset of `.java` files within an
336 `android_library` for subsequent builds.
337 * Can cause infrequent (once a month-ish) failures due to not recompiling a
338 class that should be recompiled.
339
340#### Incremental Install
Andrew Grievec81af4a2017-07-26 18:02:13341"Incremental install" uses reflection and side-loading to speed up the edit
estevenson75e9b862017-01-05 16:49:23342& deploy cycle (normally < 10 seconds). The initial launch of the apk will be
343a little slower since updated dex files are installed manually.
tfarinaa68eb902016-04-12 19:43:05344
tfarinaa68eb902016-04-12 19:43:05345* All apk targets have \*`_incremental` targets defined (e.g.
estevenson75e9b862017-01-05 16:49:23346 `chrome_public_apk_incremental`) except for Webview and Monochrome
tfarinaa68eb902016-04-12 19:43:05347
348Here's an example:
349
350```shell
Max Morozf5b31fcd2018-08-10 21:55:48351autoninja -C out/Default chrome_public_apk_incremental
Andrew Grievec81af4a2017-07-26 18:02:13352out/Default/bin/chrome_public_apk install --incremental --verbose
tfarinaa68eb902016-04-12 19:43:05353```
354
355For gunit tests (note that run_*_incremental automatically add
Andrew Grievec81af4a2017-07-26 18:02:13356`--fast-local-dev` when calling `test_runner.py`):
tfarinaa68eb902016-04-12 19:43:05357
358```shell
Max Morozf5b31fcd2018-08-10 21:55:48359autoninja -C out/Default base_unittests_incremental
tfarinaa68eb902016-04-12 19:43:05360out/Default/bin/run_base_unittests_incremental
361```
362
363For instrumentation tests:
364
365```shell
Max Morozf5b31fcd2018-08-10 21:55:48366autoninja -C out/Default chrome_public_test_apk_incremental
tfarinaa68eb902016-04-12 19:43:05367out/Default/bin/run_chrome_public_test_apk_incremental
368```
369
370To uninstall:
371
372```shell
Andrew Grievec81af4a2017-07-26 18:02:13373out/Default/bin/chrome_public_apk uninstall
tfarinaa68eb902016-04-12 19:43:05374```
375
Andrew Grievec81af4a2017-07-26 18:02:13376To avoid typing `_incremental` when building targets, you can use the GN arg:
estevenson75e9b862017-01-05 16:49:23377
Andrew Grievec81af4a2017-07-26 18:02:13378```
379incremental_apk_by_default = true
estevenson75e9b862017-01-05 16:49:23380```
381
Andrew Grievec81af4a2017-07-26 18:02:13382This will make `chrome_public_apk` build in incremental mode.
383
Andrew Grieveae094e392018-06-15 16:10:22384## Installing and Running Chromium on an Emulator
385
386Running on an emulator is the same as on a device. Refer to
Raphael Kubo da Costafe411ff2018-06-20 08:16:50387[android_emulator.md](android_emulator.md) for setting up emulators.
Andrew Grieveae094e392018-06-15 16:10:22388
estevenson75e9b862017-01-05 16:49:23389
dpranke0ae7cad2016-11-30 07:47:58390## Tips, tricks, and troubleshooting
tfarinaa68eb902016-04-12 19:43:05391
dpranke0ae7cad2016-11-30 07:47:58392### Rebuilding libchrome.so for a particular release
tfarinaa68eb902016-04-12 19:43:05393
yfriedman9b4327b2016-05-04 16:36:24394These instructions are only necessary for Chrome 51 and earlier.
395
tfarinaa68eb902016-04-12 19:43:05396In the case where you want to modify the native code for an existing
397release of Chrome for Android (v25+) you can do the following steps.
398Note that in order to get your changes into the official release, you'll
399need to send your change for a codereview using the regular process for
400committing code to chromium.
401
4021. Open Chrome on your Android device and visit chrome://version
4032. Copy down the id listed next to "Build ID:"
4043. Go to
405 [http://storage.googleapis.com/chrome-browser-components/BUILD\_ID\_FROM\_STEP\_2/index.html](http://storage.googleapis.com/chrome-browser-components/BUILD_ID_FROM_STEP_2/index.html)
4064. Download the listed files and follow the steps in the README.