blob: 71eee041383b10ec3b4d2cf1d72703e09070f8db [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
sdy93387fa2016-12-01 01:03:44118Chromium uses [Ninja](https://ninja-build.org) as its main build tool along
119with a tool called [GN](../tools/gn/docs/quick_start.md) to generate `.ninja`
120files. You can create any number of *build directories* with different
121configurations. To create a build directory which builds Chrome for Android,
122run:
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
Andrew Grievec81af4a2017-07-26 18:02:13147ninja -C out/Default chrome_public_apk
sdy93387fa2016-12-01 01:03:44148```
dpranke0ae7cad2016-11-30 07:47:58149
sdy93387fa2016-12-01 01:03:44150You can get a list of all of the other build targets from GN by running `gn ls
151out/Default` from the command line. To compile one, pass the GN label to Ninja
152with no preceding "//" (so, for `//chrome/test:unit_tests` use `ninja -C
153out/Default chrome/test:unit_tests`).
154
Andrew Grieve052376a2017-09-26 01:54:11155### Multiple Chrome APK Targets
156
157The Google Play Store allows apps to send customized `.apk` files depending on
158the version of Android running on a device. Chrome uses this feature to target
1593 different versions using 3 different ninja targets:
160
1611. `chrome_public_apk` (ChromePublic.apk)
162 * `minSdkVersion=16` (Jelly Bean).
163 * Stores libchrome.so compressed within the APK.
164 * Uses [Crazy Linker](https://cs.chromium.org/chromium/src/base/android/linker/BUILD.gn?rcl=6bb29391a86f2be58c626170156cbfaa2cbc5c91&l=9).
165 * Shipped only for Android < 21, but still works fine on Android >= 21.
1662. `chrome_modern_public_apk` (ChromeModernPublic.apk)
167 * `minSdkVersion=21` (Lollipop).
168 * Uses [Crazy Linker](https://cs.chromium.org/chromium/src/base/android/linker/BUILD.gn?rcl=6bb29391a86f2be58c626170156cbfaa2cbc5c91&l=9).
169 * Stores libchrome.so uncompressed within the APK.
170 * This APK is bigger, but the installation size is smaller since there is
171 no need to extract the .so file.
1723. `monochrome_public_apk` (MonochromePublic.apk)
173 * `minSdkVersion=24` (Nougat).
174 * Contains both WebView and Chrome within the same APK.
175 * This APK is even bigger, but much smaller than SystemWebView.apk + ChromePublic.apk.
176 * Stores libchrome.so uncompressed within the APK.
177 * Does not use Crazy Linker (WebView requires system linker).
178 * But system linker supports crazy linker features now anyways.
179
180**Note**: These instructions use `chrome_public_apk`, but either of the other
181two targets can be substituted.
182
183**Note**: These targets are actually the open-source equivalents to the
184closed-source targets that get shipped to the Play Store.
185
Andrew Grieved2ec82d2018-05-22 14:28:43186**Note**: For more in-depth differences, see [android_native_libraries.md](android_native_libraries.md).
187
Mark Pearsone9042242018-02-20 23:49:33188## Updating your checkout
189
190To update an existing checkout, you can run
191
192```shell
193$ git rebase-update
194$ gclient sync
195```
196
197The first command updates the primary Chromium source repository and rebases
198any of your local branches on top of tip-of-tree (aka the Git branch
199`origin/master`). If you don't want to use this script, you can also just use
200`git pull` or other common Git commands to update the repo.
201
202The second command syncs dependencies to the appropriate versions and re-runs
203hooks as needed.
204
dpranke0ae7cad2016-11-30 07:47:58205## Installing and Running Chromium on a device
tfarinaba2792fa2016-04-07 15:50:42206
tfarinaba2792fa2016-04-07 15:50:42207### Plug in your Android device
208
209Make sure your Android device is plugged in via USB, and USB Debugging
210is enabled.
211
212To enable USB Debugging:
213
214* Navigate to Settings \> About Phone \> Build number
215* Click 'Build number' 7 times
216* Now navigate back to Settings \> Developer Options
217* Enable 'USB Debugging' and follow the prompts
218
219You may also be prompted to allow access to your PC once your device is
220plugged in.
221
222You can check if the device is connected by running:
223
224```shell
225third_party/android_tools/sdk/platform-tools/adb devices
226```
227
228Which prints a list of connected devices. If not connected, try
229unplugging and reattaching your device.
tfarinaa68eb902016-04-12 19:43:05230
Thiemo Nagele03fb6c2018-07-31 08:29:31231### Enable apps from unknown sources
232
233Allow Android to run APKs that haven't been signed through the Play Store:
234
235* Enable 'Unknown sources' under Settings \> Security
236
237In case that setting isn't present, it may be possible to configure it via
238`adb shell` instead:
239
240```shell
241third_party/android_tools/sdk/platform-tools/adb shell settings put global verifier_verify_adb_installs 0
242```
243
tfarinaa68eb902016-04-12 19:43:05244### Build the full browser
245
tfarinaa68eb902016-04-12 19:43:05246```shell
Yipeng Wangfd7db172017-04-25 17:27:18247ninja -C out/Default chrome_public_apk
tfarinaa68eb902016-04-12 19:43:05248```
249
250And deploy it to your Android device:
251
252```shell
Andrew Grievec81af4a2017-07-26 18:02:13253out/Default/bin/chrome_public_apk install
tfarinaa68eb902016-04-12 19:43:05254```
255
256The app will appear on the device as "Chromium".
257
258### Build Content shell
259
260Wraps the content module (but not the /chrome embedder). See
xiaoyin.l1003c0b2016-12-06 02:51:17261[https://www.chromium.org/developers/content-module](https://www.chromium.org/developers/content-module)
tfarinaa68eb902016-04-12 19:43:05262for details on the content module and content shell.
263
264```shell
Yipeng Wangfd7db172017-04-25 17:27:18265ninja -C out/Default content_shell_apk
Andrew Grievec81af4a2017-07-26 18:02:13266out/Default/bin/content_shell_apk install
tfarinaa68eb902016-04-12 19:43:05267```
268
269this will build and install an Android apk under
Yipeng Wang613ba692017-04-25 18:24:39270`out/Default/apks/ContentShell.apk`.
tfarinaa68eb902016-04-12 19:43:05271
ntfschr29a7adab2017-03-23 21:17:08272### Build WebView
tfarinaa68eb902016-04-12 19:43:05273
xiaoyin.l1003c0b2016-12-06 02:51:17274[Android WebView](https://developer.android.com/reference/android/webkit/WebView.html)
tfarinaa68eb902016-04-12 19:43:05275is a system framework component. Since Android KitKat, it is implemented using
xiaoyin.l1003c0b2016-12-06 02:51:17276Chromium code (based off the [content module](https://dev.chromium.org/developers/content-module)).
tfarinaa68eb902016-04-12 19:43:05277
ntfschr29a7adab2017-03-23 21:17:08278If you want to build the complete Android WebView framework component and test
279the effect of your chromium changes in Android apps using WebView, you should
280follow the [Android AOSP + chromium WebView
281instructions](https://www.chromium.org/developers/how-tos/build-instructions-android-webview)
tfarinaa68eb902016-04-12 19:43:05282
283### Running
284
tfarinaa68eb902016-04-12 19:43:05285For Content shell:
286
287```shell
Andrew Grievec81af4a2017-07-26 18:02:13288out/Default/bin/content_shell_apk launch [--args='--foo --bar'] http://example.com
tfarinaa68eb902016-04-12 19:43:05289```
290
291For Chrome public:
292
293```shell
Andrew Grievec81af4a2017-07-26 18:02:13294out/Default/bin/chrome_public_apk launch [--args='--foo --bar'] http://example.com
tfarinaa68eb902016-04-12 19:43:05295```
296
tfarinaa68eb902016-04-12 19:43:05297### Logging and debugging
298
299Logging is often the easiest way to understand code flow. In C++ you can print
Andrew Grievec81af4a2017-07-26 18:02:13300log statements using the LOG macro. In Java, refer to
301[android_logging.md](android_logging.md).
tfarinaa68eb902016-04-12 19:43:05302
Andrew Grievec81af4a2017-07-26 18:02:13303You can see these log via `adb logcat`, or:
tfarinaa68eb902016-04-12 19:43:05304
305```shell
Andrew Grievec81af4a2017-07-26 18:02:13306out/Default/bin/chrome_public_apk logcat
tfarinaa68eb902016-04-12 19:43:05307```
308
Andrew Grievec81af4a2017-07-26 18:02:13309To debug C++ code, use one of the following commands:
tfarinaa68eb902016-04-12 19:43:05310
311```shell
Andrew Grievec81af4a2017-07-26 18:02:13312out/Default/bin/content_shell_apk gdb
313out/Default/bin/chrome_public_apk gdb
tfarinaa68eb902016-04-12 19:43:05314```
315
Philip Jägenstedt17f89962017-05-18 08:25:54316See [Android Debugging Instructions](android_debugging_instructions.md)
tfarinaa68eb902016-04-12 19:43:05317for more on debugging, including how to debug Java code.
318
319### Testing
320
Philip Jägenstedt17f89962017-05-18 08:25:54321For information on running tests, see [Android Test Instructions](android_test_instructions.md).
tfarinaa68eb902016-04-12 19:43:05322
Andrew Grievec81af4a2017-07-26 18:02:13323### Faster Edit/Deploy
tfarinaa68eb902016-04-12 19:43:05324
Andrew Grievec81af4a2017-07-26 18:02:13325"Incremental install" uses reflection and side-loading to speed up the edit
estevenson75e9b862017-01-05 16:49:23326& deploy cycle (normally < 10 seconds). The initial launch of the apk will be
327a little slower since updated dex files are installed manually.
tfarinaa68eb902016-04-12 19:43:05328
329* Make sure to set` is_component_build = true `in your GN args
330* All apk targets have \*`_incremental` targets defined (e.g.
estevenson75e9b862017-01-05 16:49:23331 `chrome_public_apk_incremental`) except for Webview and Monochrome
tfarinaa68eb902016-04-12 19:43:05332
333Here's an example:
334
335```shell
336ninja -C out/Default chrome_public_apk_incremental
Andrew Grievec81af4a2017-07-26 18:02:13337out/Default/bin/chrome_public_apk install --incremental --verbose
tfarinaa68eb902016-04-12 19:43:05338```
339
340For gunit tests (note that run_*_incremental automatically add
Andrew Grievec81af4a2017-07-26 18:02:13341`--fast-local-dev` when calling `test_runner.py`):
tfarinaa68eb902016-04-12 19:43:05342
343```shell
344ninja -C out/Default base_unittests_incremental
345out/Default/bin/run_base_unittests_incremental
346```
347
348For instrumentation tests:
349
350```shell
351ninja -C out/Default chrome_public_test_apk_incremental
352out/Default/bin/run_chrome_public_test_apk_incremental
353```
354
355To uninstall:
356
357```shell
Andrew Grievec81af4a2017-07-26 18:02:13358out/Default/bin/chrome_public_apk uninstall
tfarinaa68eb902016-04-12 19:43:05359```
360
Andrew Grievec81af4a2017-07-26 18:02:13361To avoid typing `_incremental` when building targets, you can use the GN arg:
estevenson75e9b862017-01-05 16:49:23362
Andrew Grievec81af4a2017-07-26 18:02:13363```
364incremental_apk_by_default = true
estevenson75e9b862017-01-05 16:49:23365```
366
Andrew Grievec81af4a2017-07-26 18:02:13367This will make `chrome_public_apk` build in incremental mode.
368
Andrew Grieveae094e392018-06-15 16:10:22369## Installing and Running Chromium on an Emulator
370
371Running on an emulator is the same as on a device. Refer to
Raphael Kubo da Costafe411ff2018-06-20 08:16:50372[android_emulator.md](android_emulator.md) for setting up emulators.
Andrew Grieveae094e392018-06-15 16:10:22373
estevenson75e9b862017-01-05 16:49:23374
dpranke0ae7cad2016-11-30 07:47:58375## Tips, tricks, and troubleshooting
tfarinaa68eb902016-04-12 19:43:05376
dpranke0ae7cad2016-11-30 07:47:58377### Rebuilding libchrome.so for a particular release
tfarinaa68eb902016-04-12 19:43:05378
yfriedman9b4327b2016-05-04 16:36:24379These instructions are only necessary for Chrome 51 and earlier.
380
tfarinaa68eb902016-04-12 19:43:05381In the case where you want to modify the native code for an existing
382release of Chrome for Android (v25+) you can do the following steps.
383Note that in order to get your changes into the official release, you'll
384need to send your change for a codereview using the regular process for
385committing code to chromium.
386
3871. Open Chrome on your Android device and visit chrome://version
3882. Copy down the id listed next to "Build ID:"
3893. Go to
390 [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)
3914. Download the listed files and follow the steps in the README.