blob: f6d0287d28e75e4f28dbc347dc3ac79a9e0392b3 [file] [log] [blame] [view]
dprankec641a5342017-04-04 02:35:011# Checking out and building Cast for Android
2
3**Note**: it is **not possible** to build a binary functionally
4equivalent to a Chromecast. This is to build a single-page content
5embedder with similar functionality to Cast products.
6
7## Instructions for Google Employees
8
9Are you a Google employee? See
10[go/building-android-cast](https://goto.google.com/building-android-cast) instead.
11
12[TOC]
13
14## System requirements
15
16* 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.
20
21Most development is done on Ubuntu. Other distros may or may not work;
22see the [Linux instructions](linux_build_instructions.md) for some suggestions.
23
24Building the Android client on Windows or Mac is not supported and doesn't work.
25
26## Install `depot_tools`
27
28Clone the `depot_tools` repository:
29
30```shell
31$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
32```
33
34Add `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`:
37
38```shell
39$ export PATH="$PATH:/path/to/depot_tools"
40```
41
42## Get the code
43
44Create a `chromium` directory for the checkout and change to it (you can call
45this whatever you like and put it wherever you like, as
46long as the full path has no spaces):
47
48```shell
49$ mkdir ~/chromium && cd ~/chromium
50$ fetch --nohooks android
51```
52
53If you don't want the full repo history, you can save a lot of time by
54adding the `--no-history` flag to `fetch`.
55
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
60checkout, for example), you can omit the `--nohooks` flag and `fetch`
61will automatically execute `gclient runhooks` at the end.
62
63When `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:
66
67```shell
68$ cd src
69```
70
71### Converting an existing Linux checkout
72
73If you have an existing Linux checkout, you can add Android support by
74appending `target_os = ['android']` to your `.gclient` file (in the
75directory above `src`):
76
77```shell
78$ echo "target_os = [ 'android' ]" >> ../.gclient
79```
80
81Then run `gclient sync` to pull the new Android dependencies:
82
83```shell
84$ gclient sync
85```
86
87(This is the only difference between `fetch android` and `fetch chromium`.)
88
89### Install additional build dependencies
90
91Once you have checked out the code, run
92
93```shell
94$ build/install-build-deps-android.sh
95```
96
97to get all of the dependencies you need to build on Linux, *plus* all of the
98Android-specific dependencies (you need some of the regular Linux dependencies
99because an Android build includes a bunch of the Linux tools and utilities).
100
101### Run the hooks
102
103Once you've run `install-build-deps` at least once, you can now run the
104Chromium-specific hooks, which will download additional binaries and other
105things you might need:
106
107```shell
108$ gclient runhooks
109```
110
111*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.
115
116## Setting up the build
117
118Chromium 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:
123
124```shell
125$ gn gen --args='target_os="android" is_chromecast=true' out/Default
126```
127
128* 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).
134 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
139Also be aware that some scripts (e.g. `tombstones.py`, `adb_gdb.py`)
140require you to set `CHROMIUM_OUTPUT_DIR=out/Default`.
141
142## Build cast\_shell\_apk
143
144Build cast\_shell\_apk with Ninja using the command:
145
146```shell
147$ ninja -C out/Default cast_shell_apk
148```
149
150## Installing and Running cast\_shell\_apk on a device
151
152If the `adb_install_apk.py` script below fails, make sure `aapt` is in your
153PATH. If not, add `aapt`'s parent directory to your `PATH` environment variable
154(it should be
155`/path/to/src/third_party/android_tools/sdk/build-tools/{latest_version}/`).
156
157Prepare the environment:
158
159```shell
160$ . build/android/envsetup.sh
161```
162
163### Plug in your Android device
164
165Make sure your Android device is plugged in via USB, and USB Debugging
166is enabled.
167
168To enable USB Debugging:
169
170* Navigate to Settings \> About Phone \> Build number
171* Click 'Build number' 7 times
172* Now navigate back to Settings \> Developer Options
173* Enable 'USB Debugging' and follow the prompts
174
175You may also be prompted to allow access to your PC once your device is
176plugged in.
177
178You can check if the device is connected by running:
179
180```shell
181third_party/android_tools/sdk/platform-tools/adb devices
182```
183
184Which prints a list of connected devices. If not connected, try
185unplugging and reattaching your device.
186
187### Build the APK
188
189```shell
190ninja -C out/Release cast_shell_apk
191```
192
193And deploy it to your Android device:
194
195```shell
196build/android/adb_install_apk.py out/Default/apks/CastShell.apk
197adb shell am start -d "http://google.com" org.chromium.chromecast.shell/.CastShellActivity
198
199```
200
201The app will appear on the device as "Chromium".
202
203### Build Content shell
204
205Wraps the content module (but not the /chrome embedder). See
206[https://www.chromium.org/developers/content-module](https://www.chromium.org/developers/content-module)
207for details on the content module and content shell.
208
209```shell
210ninja -C out/Release content_shell_apk
211build/android/adb_install_apk.py out/Release/apks/ContentShell.apk
212```
213
214this will build and install an Android apk under
215`out/Release/apks/ContentShell.apk`. (Where `Release` is the name of your build
216directory.)
217
218If you use custom out dir instead of standard out/ dir, use
219CHROMIUM_OUT_DIR env.
220
221```shell
222export CHROMIUM_OUT_DIR=out_android
223```
224
225### Build WebView shell
226
227[Android WebView](https://developer.android.com/reference/android/webkit/WebView.html)
228is a system framework component. Since Android KitKat, it is implemented using
229Chromium code (based off the [content module](https://dev.chromium.org/developers/content-module)).
230It is possible to test modifications to WebView using a simple test shell. The
231WebView shell is a view with a URL bar at the top (see [code](https://code.google.com/p/chromium/codesearch#chromium/src/android_webview/test/shell/src/org/chromium/android_webview/test/AwTestContainerView.java))
232and is **independent** of the WebView **implementation in the Android system** (
233the WebView shell is essentially a standalone unbundled app).
234As drawback, the shell runs in non-production rendering mode only.
235
236```shell
237ninja -C out/Release android_webview_apk
238build/android/adb_install_apk.py out/Release/apks/AndroidWebView.apk
239```
240
241If, 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](https://www.chromium.org/developers/how-tos/build-instructions-android-webview)
242
243### Running
244
245Set [command line flags](https://www.chromium.org/developers/how-tos/run-chromium-with-flags) if necessary.
246
247For Content shell:
248
249```shell
250build/android/adb_run_content_shell http://example.com
251```
252
253For Chrome public:
254
255```shell
256build/android/adb_run_chrome_public http://example.com
257```
258
259For Android WebView shell:
260
261```shell
262build/android/adb_run_android_webview_shell http://example.com
263```
264
265### Logging and debugging
266
267Logging is often the easiest way to understand code flow. In C++ you can print
268log statements using the LOG macro or printf(). In Java, you can print log
269statements using [android.util.Log](https://developer.android.com/reference/android/util/Log.html):
270
271`Log.d("sometag", "Reticulating splines progress = " + progress);`
272
273You can see these log statements using adb logcat:
274
275```shell
276adb logcat...01-14 11:08:53.373 22693 23070 D sometag: Reticulating splines progress = 0.99
277```
278
279You can debug Java or C++ code. To debug C++ code, use one of the
280following commands:
281
282```shell
283build/android/adb_gdb_content_shell
284build/android/adb_gdb_chrome_public
285build/android/adb_gdb_android_webview_shell http://example.com
286```
287
288See [Debugging Chromium on Android](https://www.chromium.org/developers/how-tos/debugging-on-android)
289for more on debugging, including how to debug Java code.
290
291### Testing
292
293For information on running tests, see [android\_test\_instructions.md](https://chromium.googlesource.com/chromium/src/+/master/docs/android_test_instructions.md).
294
295### Faster Edit/Deploy (GN only)
296
297GN's "incremental install" uses reflection and side-loading to speed up the edit
298& deploy cycle (normally < 10 seconds). The initial launch of the apk will be
299a little slower since updated dex files are installed manually.
300
301* Make sure to set` is_component_build = true `in your GN args
302* All apk targets have \*`_incremental` targets defined (e.g.
303 `chrome_public_apk_incremental`) except for Webview and Monochrome
304
305Here's an example:
306
307```shell
308ninja -C out/Default chrome_public_apk_incremental
309out/Default/bin/install_chrome_public_apk_incremental -v
310```
311
312For gunit tests (note that run_*_incremental automatically add
313--fast-local-dev when calling test\_runner.py):
314
315```shell
316ninja -C out/Default base_unittests_incremental
317out/Default/bin/run_base_unittests_incremental
318```
319
320For instrumentation tests:
321
322```shell
323ninja -C out/Default chrome_public_test_apk_incremental
324out/Default/bin/run_chrome_public_test_apk_incremental
325```
326
327To uninstall:
328
329```shell
330out/Default/bin/install_chrome_public_apk_incremental -v --uninstall
331```
332
333A subtly erroneous flow arises when you build a regular apk but install an
334incremental apk (e.g.
335`ninja -C out/Default foo_apk && out/Default/bin/install_foo_apk_incremental`).
336Setting `incremental_apk_by_default = true` in your GN args aliases regular
337targets as their incremental counterparts. With this arg set, the commands
338above become:
339
340```shell
341ninja -C out/Default chrome_public_apk
342out/Default/bin/install_chrome_public_apk
343
344ninja -C out/Default base_unittests
345out/Default/bin/run_base_unittests
346
347ninja -C out/Default chrome_public_test_apk
348out/Default/bin/run_chrome_public_test_apk
349```
350
351If you want to build a non-incremental apk you'll need to remove
352`incremental_apk_by_default` from your GN args.
353
354## Tips, tricks, and troubleshooting
355
356### Rebuilding libchrome.so for a particular release
357
358These instructions are only necessary for Chrome 51 and earlier.
359
360In the case where you want to modify the native code for an existing
361release of Chrome for Android (v25+) you can do the following steps.
362Note that in order to get your changes into the official release, you'll
363need to send your change for a codereview using the regular process for
364committing code to chromium.
365
3661. Open Chrome on your Android device and visit chrome://version
3672. Copy down the id listed next to "Build ID:"
3683. Go to
369 [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)
3704. Download the listed files and follow the steps in the README.