blob: e1faa6f76a2a61f178cb2baaad00c38d284b8e3e [file] [log] [blame] [view]
jbudorick900a8d832016-07-18 18:56:051# Android Studio
2
jbudorick900a8d832016-07-18 18:56:053[TOC]
4
5## Usage
6
wnwen9032b352017-02-09 15:53:337Make sure you have followed
8[android build instructions](android_build_instructions.md) already.
wnwene397fec62017-01-19 20:25:219
jbudorick900a8d832016-07-18 18:56:0510```shell
Peter Wena2d96112018-05-10 20:29:4311build/android/gradle/generate_gradle.py --output-directory out/Debug
jbudorick900a8d832016-07-18 18:56:0512```
13
Peter Wencb519572018-05-16 17:39:1814The above commands create a project dir `gradle` under your output directory.
15Use `--project-dir <project-dir>` to change this.
Anthony Berent8d3ce022018-01-15 12:24:3616
Peter Wenefd17272018-05-23 18:51:4017To import the project:
18* Use "Import Project", and select the directory containing the generated
19 project, e.g. `out/Debug/gradle`.
Anthony Berent8d3ce022018-01-15 12:24:3620
Ken Rockot35028ca2019-05-30 18:50:4521See [android_test_instructions.md](testing/android_test_instructions.md#Using-Emulators)
Peter Wenefd17272018-05-23 18:51:4022for more information about building and running emulators.
agrieve0c28e4f2016-09-22 01:05:2023
Peter Wenf8cc36fe2019-01-09 17:52:3124If you're asked to use Studio's Android SDK: No.
Andrew Grieve17b03142017-10-04 14:50:0925
Peter Wenf8cc36fe2019-01-09 17:52:3126If you're asked to use Studio's Gradle wrapper: Yes.
Andrew Grieve17b03142017-10-04 14:50:0927
Peter Wend46a8672023-01-24 20:36:1028You need to re-run `generate_gradle.py` whenever `BUILD.gn` files change, for
29example, when you add a new directory containing source files.
agrieve0c28e4f2016-09-22 01:05:2030
Peter Wend46a8672023-01-24 20:36:1031Since newer gradle versions are released regularly and it is not possible to set
32a gradle version in `root.jinja` that is the newest for each version of Android
33Studio, feel free to update the value in `build.gradle` locally when you see the
34"A newer version of gradle is available" notification. This will likely happen
35each time after `generate_gradle.py` runs.
Peter Wena2d96112018-05-10 20:29:4336
wnwen9032b352017-02-09 15:53:3337* After regenerating, Android Studio should prompt you to "Sync". If it
Peter Wena2d96112018-05-10 20:29:4338 doesn't, try some of the following options:
39 * File -&gt; "Sync Project with Gradle Files"
wnwen0227e4a52017-02-09 21:14:5140 * Button with two arrows on the right side of the top strip.
wnwend65703a2016-11-24 18:47:3141 * Help -&gt; Find Action -&gt; "Sync Project with Gradle Files"
wnwen0227e4a52017-02-09 21:14:5142 * After `gn clean` you may need to restart Android Studio.
Peter Wena2d96112018-05-10 20:29:4343 * File -&gt; "Invalidate Caches / Restart..."
agrieve0c28e4f2016-09-22 01:05:2044
wnwen03427bc2017-04-19 19:22:2445## How It Works
agrieve0c28e4f2016-09-22 01:05:2046
Peter Wena2d96112018-05-10 20:29:4347By default, only an `_all` module containing all java apk targets is generated.
48If just one apk target is explicitly specified, then a single apk module is
49generated.
wnwene851ad472017-04-27 16:21:4250
51To see more detailed structure of gn targets, the `--split-projects` flag can
52be used. This will generate one module for every gn target in the dependency
Peter Wend46a8672023-01-24 20:36:1053graph. This can be very slow.
agrieve0c28e4f2016-09-22 01:05:2054
wnwen03427bc2017-04-19 19:22:2455### Excluded Files
agrieve0c28e4f2016-09-22 01:05:2056
wnwen03427bc2017-04-19 19:22:2457Gradle supports source directories but not source files. However, files in
58Chromium are used amongst multiple targets. To accommodate this, the script
59detects such targets and creates exclude patterns to exclude files not in the
Peter Wena2d96112018-05-10 20:29:4360current target. The editor does not respect these exclude patterns, so the
61`_all` pseudo module is added which includes directories from all targets. This
62allows imports and refactoring to be across all targets.
wnwen03427bc2017-04-19 19:22:2463
64### Extracting .srcjars
agrieve0c28e4f2016-09-22 01:05:2065
66Most generated .java files in GN are stored as `.srcjars`. Android Studio does
Peter Wen9b5ef212018-07-13 03:55:3167not support them. The generator script builds and extracts them to
68`extracted-srcjars/` subdirectories for each target that contains generated
69files. This is the reason that the `_all` pseudo module may contain multiple
70copies of generated files. It can be slow to build all these generated files,
71so if `--fast` is passed then the generator script skips building and
72extracting them.
agrieve0c28e4f2016-09-22 01:05:2073
74*** note
Peter Wen9b5ef212018-07-13 03:55:3175** TLDR:** Always re-generate project files when generated files change (this
76includes `R.java`).
agrieve0c28e4f2016-09-22 01:05:2077***
78
Peter Wena2d96112018-05-10 20:29:4379### Native Files
80
Peter Wend46a8672023-01-24 20:36:1081This option is no longer supported since Android Studio is very slow when
82editing in a code base with a large number of C++ files, and Chromium has a lot
83of C++ code. It is recommended to use [VS Code](vscode.md) to edit native files
84and stick to just editing java files in Android Studio.
85
86If you still want to enable editing native C/C++ files with Android Studio, pass
87in any number of `--native-target [target name]` flags in order to use it. The
88target must be the full path and name of a valid gn target (no short-forms).
89This will require you to install `cmake` and `ndk` when prompted. Accept Android
90Studio's prompts for these SDK packages.
Peter Wen8393de82018-05-17 20:58:5491
Peter Wenf8cc36fe2019-01-09 17:52:3192You need to disable a new gradle option in order to edit native files:
93File -&gt; Settings -&gt; Experimental
94-&gt; Gradle and uncheck "Only resolve selected variants".
95
Peter Wen8393de82018-05-17 20:58:5496This is not necessary, but to avoid "This file is not part of the project...",
97you can either add an extra `--native-target` flag or simply copy and paste the
98absolute path to that file into the CMakeLists.txt file alongside the existing
Peter Wenf8cc36fe2019-01-09 17:52:3199file paths. Note that changes to CMakeLists.txt will be overwritten on your next
100invocation of `generate_gradle.py`.
Peter Wen8393de82018-05-17 20:58:54101
102Example:
Peter Wena2d96112018-05-10 20:29:43103
104```shell
Richard Heb08a6942020-08-11 00:36:26105build/android/gradle/generate_gradle.py --native-target //chrome/android:libchrome
Peter Wena2d96112018-05-10 20:29:43106```
107
Peter Wencb519572018-05-16 17:39:18108## Tips
jbudorick900a8d832016-07-18 18:56:05109
Peter Wencb519572018-05-16 17:39:18110* Use environment variables to avoid having to specify `--output-directory`.
111 * Example: Append `export CHROMIUM_OUT_DIR=out; export BUILDTYPE=Debug` to
112 your `~/.bashrc` to always default to `out/Debug`.
Peter Wen667abd52018-05-17 00:12:25113* Using the Java debugger is documented [here](android_debugging_instructions.md#android-studio).
wnwen9032b352017-02-09 15:53:33114* Configuration instructions can be found
115 [here](http://tools.android.com/tech-docs/configuration). One suggestions:
116 * Launch it with more RAM:
117 `STUDIO_VM_OPTIONS=-Xmx2048m /opt/android-studio-stable/bin/studio-launcher.sh`
wnwend65703a2016-11-24 18:47:31118* If you ever need to reset it: `rm -r ~/.AndroidStudio*/`
Boris Sazonova084e8f92017-09-14 12:29:18119* Import Chromium-specific style and inspections settings:
wnwen9032b352017-02-09 15:53:33120 * Help -&gt; Find Action -&gt; "Code Style" (settings) -&gt; Java -&gt;
Boris Sazonova084e8f92017-09-14 12:29:18121 Scheme -&gt; Import Scheme
122 * Select `tools/android/android_studio/ChromiumStyle.xml` -&gt; OK
123 * Help -&gt; Find Action -&gt; "Inspections" (settings) -&gt;
124 Profile -&gt; Import profile
125 * Select `tools/android/android_studio/ChromiumInspections.xml` -&gt; OK
wnwend65703a2016-11-24 18:47:31126* Turn on automatic import:
127 * Help -&gt; Find Action -&gt; "Auto Import"
128 * Tick all the boxes under "Java" and change the dropdown to "All".
wnwen67b64972016-12-19 19:53:15129* Turn on documentation on mouse hover:
130 * Help -&gt; Find Action -&gt; "Show quick documentation on mouse move"
131* Turn on line numbers:
132 * Help -&gt; Find Action -&gt; "Show line numbers"
Peter Wena2d96112018-05-10 20:29:43133* Turn off indent notification:
134 * Help -&gt; Find Action -&gt; "Show notifications about detected indents"
zpeng38bf00de2017-05-10 16:05:03135* Format changed files (Useful for changes made by running code inspection):
136 * Set up version control
137 * File -&gt; Settings -&gt; Version Control
138 * Add src directories
139 * Commit changes and reformat
140 * Help -&gt; Find Action -&gt; "Commit Changes"
141 * Check "Reformat code" & "Optimize imports" and commit
Peter Wencf4236de2018-05-23 19:26:36142* Change theme from GTK+ to another one to avoid invisible menus.
143 * Help -&gt; Find Action -&gt; "Theme: Settings > Appearance"
agrieve0c28e4f2016-09-22 01:05:20144
145### Useful Shortcuts
146
wnwend65703a2016-11-24 18:47:31147* `Shift - Shift`: Search to open file or perform IDE action
148* `Ctrl + N`: Jump to class
149* `Ctrl + Shift + T`: Jump to test
150* `Ctrl + Shift + N`: Jump to file
151* `Ctrl + F12`: Jump to method
152* `Ctrl + G`: Jump to line
153* `Shift + F6`: Rename variable
154* `Ctrl + Alt + O`: Organize imports
155* `Alt + Enter`: Quick Fix (use on underlined errors)
wnwenfdea62ce2017-04-05 13:12:54156* `F2`: Find next error
jbudorick900a8d832016-07-18 18:56:05157
agrievec62a52d2016-09-22 01:48:24158### Building from the Command Line
159
wnwen9032b352017-02-09 15:53:33160Gradle builds can be done from the command-line after importing the project
161into Android Studio (importing into the IDE causes the Gradle wrapper to be
162added). This wrapper can also be used to invoke gradle commands.
agrievec62a52d2016-09-22 01:48:24163
164 cd $GRADLE_PROJECT_DIR && bash gradlew
165
166The resulting artifacts are not terribly useful. They are missing assets,
167resources, native libraries, etc.
168
wnwen9032b352017-02-09 15:53:33169* Use a
170 [gradle daemon](https://docs.gradle.org/2.14.1/userguide/gradle_daemon.html)
171 to speed up builds using the gradlew script:
172 * Add the line `org.gradle.daemon=true` to `~/.gradle/gradle.properties`,
173 creating it if necessary.
wnwen660b1312016-10-21 16:46:22174
Peter Wend46a8672023-01-24 20:36:10175## Status
agrievec62a52d2016-09-22 01:48:24176
177### What works
178
Peter Wend46a8672023-01-24 20:36:10179* Android Studio v2021 & v2022.
Peter Wena2d96112018-05-10 20:29:43180* Java editing.
Peter Wen9222aa2f2018-06-13 17:50:06181 * Application code in `main` sourceset.
182 * Instrumentation test code in `androidTest` sourceset.
Peter Wend46a8672023-01-24 20:36:10183* Native code editing (deprecated, use [VS Code](vscode.md) instead).
wnwene397fec62017-01-19 20:25:21184* Symlinks to existing .so files in jniLibs (doesn't generate them).
Andrew Grieve5b89b232017-11-21 18:41:10185* Editing resource xml files
Peter Wena2d96112018-05-10 20:29:43186* Layout editor (limited functionality).
estevenson8c9318ff2017-03-10 22:16:35187* Java debugging (see
wnwenfdea62ce2017-04-05 13:12:54188[here](/docs/android_debugging_instructions.md#Android-Studio)).
Peter Wena2d96112018-05-10 20:29:43189* Import resolution and refactoring across java files.
wnwene851ad472017-04-27 16:21:42190* Correct lint and AndroidManifest when only one target is specified.
Peter Wencb519572018-05-16 17:39:18191* Emulators (more docs coming soon).
Peter Wen667abd52018-05-17 00:12:25192* Separate Android SDK for Android Studio.
agrievec62a52d2016-09-22 01:48:24193
Peter Wend46a8672023-01-24 20:36:10194### What doesn't work
agrievec62a52d2016-09-22 01:48:24195
wnwen03427bc2017-04-19 19:22:24196* Gradle being aware of assets.
Andrew Grieve17b03142017-10-04 14:50:09197* Having the "Make Project" button work correctly.
Peter Wend46a8672023-01-24 20:36:10198 * Stick to using `autoninja` to build targets and just use Android Studio
199 for editing java source files.
200* No active work is underway or planned to expand Android Studio support.