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
$ 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.
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.
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 ..
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 ../..
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"
Now that all the required changes have been made we can build:
nexus-s $ ./build.sh
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
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.