GeckoView For Gecko Engineers

Table of contents

Introduction

Who this guide is for: As the title suggests, the target audience of this guide is existing Gecko engineers who need to be able to build and (locally) test GeckoView. If you aren’t already familiar with building Firefox on a desktop platform, you’ll likely be better served by reading our general introduction. This guide may also be helpful if you find you’ve written a patch that requires changing GeckoView’s public API, see Landing a Patch.

Who this guide is not for: As mentioned above, if you are not already familiar with building Firefox for desktop, you’d likely be better served by our general bootstrapping guide. If you are looking to contribute to front-end development of one of Mozilla’s Android browsers, you’re likely better off starting with their codebase and returning here only if actual GeckoView changes are needed. See, for example, Fenix’s GitHub.

What to do if this guide contains bugs or leads you astray: The quickest way to get a response is to ask generally on #gv on Mozilla Slack; #mobile on Mozilla IRC may also work for the time being, albeit likely with slower response times. If you believe the guide needs updating, it would also be good to file a ticket to request that.

Configuring the build system

First, a quick note: This guide was written on MacOS 10.14; it should translate quite closely to other supported versions of MacOS and to Linux. Building GeckoView on Windows is not officially supported at the moment. To begin with, re-run ./mach bootstrap; it will present you with options for the version of Firefox/GV that you want to build. Currently, option 3 is GeckoView/Firefox for Android Artifact Mode and 4 is GeckoView/Firefox for Android; if you’re here, you want one of these. The brief and approximately correct breakdown of Artifact vs regular builds for GeckoView is that Artifact builds will not allow you to work on native code, only on JS or Java. Once you’ve selected your build type, bootstrap should do its usual thing and grab whatever dependencies are necessary. You may need to agree to some licenses along the way. Once bootstrap has successfully completed, it will spit out a recommended mozconfig.

Mozconfig and Building

If you’ve followed from the previous section, ./mach bootstrap printed out a recommended mozconfig that looks something like this:

# Build GeckoView/Firefox for Android:
ac_add_options --enable-application=mobile/android

# Targeting the following architecture.
# For regular phones, no --target is needed.
# For x86 emulators (and x86 devices, which are uncommon):
# ac_add_options --target=i686
# For newer phones.
# ac_add_options --target=aarch64
# For x86_64 emulators (and x86_64 devices, which are even less common):
# ac_add_options --target=x86_64

As written, this defaults to building for a 32-bit ARM architecture, which is probably not what you want. If you intend to work on an actual device, you almost certainly want a 64-bit ARM build, as it is supported by virtually all modern ARM phones/tablets and is the only ARM build we ship on the Google Play Store. To go this route, uncomment the ac_add_options --target=aarch64 line in the mozconfig. On the other hand, x86-64 emulated devices are widely used by the GeckoView team and are used extensively on try; if you intend to use an emulator, uncomment the ac_add_options --target=x86_64 line in the mozconfig. Don’t worry about installing an emulator at the moment, that will be covered shortly. It’s worth noting here that other mozconfig options will generally work as you’d expect. Additionally, if you plan on debugging native code on Android, you should include the mozconfig changes mentioned in our native debugging guide. Now, using that mozconfig with any modifications you’ve made, simply ./mach build. If all goes well, you will have successfully built GeckoView.

Installing, Running, and Using in Fenix/AC

An (x86-64) emulator is the most common and developer-friendly way of contributing to GeckoView in most cases. If you’re going to go this route, simply run ./mach android-emulator — by default, this will install and launch an x86-64 Android emulator running the same Android 7.0 image that is used on try. If you need a different emulator image you can run ./mach android-emulator --help for information on what Android images are available via mach. You can also install an emulator image via Android Studio. In cases where an emulator may not suffice (eg graphics or performance testing), or if you’d simply prefer not to use an emulator, you can opt to use an actual phone instead. To do so, you’ll need to enable USB Debugging on your phone if you haven’t already. On most modern Android devices, you can do this by opening Settings, going to About phone, and tapping Build number seven times. You should get a notification informing you that you’ve unlocked developer options. Now return to Settings, go to Developer options, and enable USB debugging.

GeckoView Example App

Now that you’ve connected a phone or setup an emulator, the simplest way to test GeckoView is to launch the GeckoView Example app by running ./mach run (or install it with ./mach install and run it yourself). This is a simplistic GV-based browser that lives in the tree; in many cases, it is sufficient to test and debug Gecko changes, and is by far the simplest way of doing so. It supports remote debugging by default — simply open Remote Debugging on your desktop browser and the connected device/emulator should show up when the example app is open. You can also use the example app for native debugging, follow the native debugging guide.

GeckoView JUnit Tests

Once you’ve successfully built GV, you can run tests from the GeckoView JUnit test suite with ./mach geckoview-junit. For further examples (eg running individual tests, repeating tests, etc.), consult the quick start guide.

Fenix and other GV-based Apps

If you are working on something for which the GeckoView Example app is not sufficient for some reason, you may need to use your local build of GeckoView in one of Mozilla’s GV-based apps like Fenix.

Debugging

Remote Debugging

To recap a bit of the above, in the GeckoView Example app, remote debugging is enabled by default, and your device should show up in your desktop browser’s Remote Debugging window with no special effort. For Fenix, you can enable remote debugging by opening the three-dot menu and toggling Remote debugging via USB under Developer tools; other Mozilla GV-based browsers have similar options.

Native Debugging

To perform native debugging on any GV app will require you to install Android Studio and follow instructions here.

Landing a Patch

In most cases, there shouldn’t be anything out of the ordinary to deal with when landing a patch that affects GeckoView; make sure you include Android in your try runs and you should be good. However, if you need to alter the GeckoView public API in any way — essentially anything that’s exposed as public in GeckoView Java files — then you’ll find that you need to run the API linter and update the change log. To do this, first run ./mach lint --linter android-api-lint — if you have indeed changed the public API, this will give you a gradle command to run that will give further instructions. GeckoView API changes require two reviews from GeckoView team members; you can open it up to the team in general by adding #geckoview-reviewers as a reviewer on Phabricator.