Update: 2013-05-07: Minor changes to deal with new and rebased patches.

Last year I posted about how to build and run B2G on the Nexus S. Much has changed since then and this post attempts to provide up to date instructions on building Firefox OS and installing the latest Gaia version.

I wrote 'attempts' because the support for the Nexus S bitrots frequently due to (I assume) most development effort going towards developer devices and devices that intend to be shipped. These instructions worked for me on my Nexus S and gives me a phone that can use Wifi, make calls, use 3G data, take photo's, record video and install applications.

Getting the source

The main source repository is on github, https://github.com/mozilla-b2g/b2g. The first step is to clone this repository. I clone this into a directory called nexus-s :

$ git clone git://github.com/mozilla-b2g/B2G nexus-s $ cd nexus-s

Create a file in this directory called .userconfig containing the following:

export CC=gcc-4.6 export CXX=g++-4.6 export HIDPI=1

The first two entries are required if you are building on Ubuntu 12.10 to use gcc version 4.6, which you must install. B2G does not build using gcc version 4.7.

The last entry, HIDPI , results in applications using the correct resources for the screen size on the Nexus S. Without this many things will be scaled incorrectly.

Configuring

Once the source is obtained you need to pull down the sub-repositories required for the Nexus S. This step downloads multiple gigabytes of data and can take a long time:

nexus-s$ BRANCH=v1-train ./config.sh nexus-s

Note the use of the BRANCH environment variable. This configures our build to use the relatively stable v1-train branch. This branch gets regular updates but tends to be better tested than master which is often broken for not-quite-supported devices like the Nexus S.

Although we are using the v1-train we are going to use the master branch of Gaia so we get the latest and greatest user interface. We'll change to this later.

Gecko changes

The branch of Gecko that v1-train uses has some bugs on the Nexus S. To fix this we need to apply some patches. The first is bug 832653, video playback broken on Nexus S. The patches relevant to Gecko from this bug that need to be applied are:

The following set of commands downloads these patches and applies them in a branch of the Gecko tree that the config.sh step previously obtained:

nexus-s $ cd gecko nexus-s/gecko $ git checkout -b nexus-s m/v1-train nexus-s/gecko $ curl -k -L https://bug832653.bugzilla.mozilla.org/attachment.cgi?id=734988 >p1.patch nexus-s/gecko $ patch -p1 <p1.patch nexus-s/gecko $ git commit -a -m "Nexus S patches" nexus-s/gecko $ cd ..

Gonk changes

Part of bug 832653 makes a change to the low level Gonk layer of B2G. This is in the libstagefright video decoding libraries. The change is to prevent output buffer starvation which results in video decoding stopping after a few frames. The required patch is:

To apply this patch:

nexus-s $ cd frameworks/base nexus-s/frameworks/base $ git checkout -b nexus-s nexus-s/frameworks/base $ curl -k -L https://bugzilla.mozilla.org/attachment.cgi?id=735002 >p1.patch nexus-s/frameworks/base $ patch -p1 <p1.patch nexus-s/frameworks/base $ git commit -a -m "Nexus S patches" nexus-s/frameworks/base $ cd ../..

Gaia changes

There are Gaia changes required as part of bug 869289 as well. This change prevents the error where videos are not listed if the thumbnail cannot be generated:

We also want to be on the Gaia master branch to get the latest and greatest code. The following comands switch to this branch and apply our patch:

nexus-s $ cd gaia nexus-s/gaia $ git checkout -b nexus-s mozillaorg/master nexus-s/gaia $ curl -k -L https://bug869289.bugzilla.mozilla.org/attachment.cgi?id=746196 >p1.patch nexus-s/gaia $ patch -p1 <p1.patch nexus-s/gaia $ git commit -a -m "Nexus S video app thumbnail fix"

There is a bug related to video recording on the Nexus S. To fix this we need a patch from bug 832638:

To apply this:

nexus-s/gaia $ curl -k -L https://bugzilla.mozilla.org/attachment.cgi?id=704241 >p2.patch nexus-s/gaia $ patch -p1 <p2.patch nexus-s/gaia $ git commit -a -m "Nexus S video recording fix"

Building

Now that all the required changes have been made we can build:

nexus-s $ ./build.sh

Installing

Once the build is complete you should be able to flash the Nexus S with the results. Note that this completely wipes everything on your phone:

nexus-s $ ./flash.sh

The phone should reboot after this step with Firefox OS installed and prompting for information from the "First Run" app.

New Zealand changes

Some New Zealand sites don't detect Firefox OS and serve their mobile versions. This can be changed by adding overrides to gaia/build/ua-override-prefs.js . I add the entries in b2gnzuaoverride.txt to this file to get stuff.co.nz, mega.co.nz and trademe.co.nz serving the correct mobile site. Once added to this file, reinstall Gaia on the phone.

nexus-s $ ./flash.sh gaia

Updating

To update the source to latest versions we need to 'rebase' our changes on top of the most recent repository changes. The following steps will do this:

nexus-s $ git pull nexus-s $ ./config.sh nexus-s nexus-s $ cd gecko nexus-s/gecko $ git rebase m/v1-train nexus-s/gecko $ cd ../gaia nexus-s/gaia $ git rebase mozillaorg/master nexus-s/gaia $ cd .. nexus-s $ ./build.sh

You may need to do some fixing up of merge conflicts if changes have occurred to the areas we've patched.

To flash the phone, overwriting everything on it, including all user data:

nexus-s $ ./flash.sh

To flash the phone, keeping (most of...) your existing user data:

nexus-s $ ./flash.sh system nexus-s $ ./flash.sh gecko nexus-s $ ./flash.sh gaia

Note that flashing gaia might remove some of your installed application icons. You'll need to reinstall those apps to fix that.