Boot to Gecko (Firefox OS) uses a kernel derived from Android, with a Gecko-based user interface on top of it. This article provides a basic guide to how to go about porting the operating system to new devices.
This guide assumes you're porting to a new device that already runs Android; if you're porting to another device, the job is going to be more involved.
Set up your build system
The first step is to configure your build system; you can follow the guide in Firefox OS build prerequisites.
Clone the B2G repository
The first step is to clone the B2G repository.
git clone https://github.com/mozilla-b2g/B2G.git
Create a local backup of the original Android system
Next, you should back up your Android device before you start nuking it with your test builds of B2G. In addition, some of these bits will be needed by the build and install process.
mkdir my_device_backup cd my_device_backup adb pull /system system
Add a new device to config.sh
The next step is to add a new device to
config.sh; you can use the existing ones as a template. This basically involves providing the instructions for fetching the correct files to do the build.
Create the manifest file for the new device
Now you need to add the required repos to the manifest file for the new device; this manifest file is called default.xml. Refer to the
b2g-manifest file on github for a template. Each device has its own branch; you can use the
galaxy-s2 branch as a reference.
Create a configuration tree for the new device
Create a new configuration tree for the new device. This should be at
device/<manufacturer>/<device_id>. This tree should include, at least:
- idc files for touchscreen
- init files (
The content here may differ a great deal from one device to another. In particular, BoardConfig.mk and extract-files.sh may differ significantly. This part requires a lot of hacking, testing, and debugging to figure out which binary blobs should be extracted.
Once you have all that done, you need to rebuild the boot image. This isn't usually needed for the kernel itself, but to pick up the changes to
Changes to init.rc
The init.rc you use is not the one provided by B2G; instead, you need to pull it from the device.
The main things you'll need to modify are:
Add the following lines to import
on early-init start ueventd import /init.b2g.rc
Correct the permissions on the files
/system/b2g/plugin-container; this should be done after the lines that mount the filesystem read/write:
chmod 0755 /system/b2g/b2g chmod 0755 /system/b2g/updater chmod 0755 /system/b2g/plugin-container
You might want to start by modifying the
init.rc from the new device instead of using the
init.rc provided by the build system; if so, you need to remember to set
Prebuilt kernel vs. building the kernel from source
You can use a prebuilt kernel, or you may build the kernel from source. To build the kernel from source, add AndroidKernel.mk and the kernel config to the device configuration tree.
The maguro on the old build system is an example that builds the kernel from source.
Extracting and modifying an existing boot image
It is possible to recover the boot image of a phone by dumping the contents of the
/dev/mtd/mtd2 devices, the resulting image file can then be easily recovered:
adb shell 'cat /dev/mtd/mtd1 > /sdcard/boot.img' adb pull /sdcard/boot.img
Once the boot image file has been obtained it can be unpacked via a helper tool such as unmkbootimg. The tool will extract both the kernel image (zImage) and the ramdisk (initramfs.cpio.gz) as well as printing out a command to rebuild the image with the same parameters of the original one, for example:
$ unmkbootimg boot.img Kernel size 3872576 Kernel address 0x208000 Ramdisk size 265102 Ramdisk address 0x1500000 Secondary size 0 Secondary address 0x1100000 Kernel tags address 0x200100 Flash page size 2048 Board name is "" Command line "androidboot.hardware=aphone" Extracting kernel to file zImage ... Extracting root filesystem to file initramfs.cpio.gz ... All done. --------------- To recompile this image, use: mkbootimg --kernel zImage --ramdisk initramfs.cpio.gz --base 0x200000 --cmdline 'androidboot.hardware=aphone' -o new_boot.img ---------------
To modify the ramdisk file create an output directory and extract it there:
mkdir initramfs_dir cd initramfs_dir gunzip -c /path/to/your/boot.img | cpio -i
Make all the required changes (such as modifying init.rc) and repack the ramdisk using
mkbootfs, be sure to use the version that has been built with the B2G host tools:
/path/to/your/B2G/out/host/linux-x86/bin/mkbootfs initramfs_dir | cpio -o -H newc | gzip > ../newinitramfs.cpio.gz
Finally re-pack the boot image using the
mkbootimg, also make sure you're using the version built with the other B2G host tools:
/path/to/your/B2G/out/host/linux-x86/bin/mkbootimg --kernel zImage --ramdisk newinitramfs.cpio.gz --base 0x200000 --cmdline 'androidboot.hardware=aphone' -o new_boot.img
If you now copy the new boot image under
out/target/product/$DEVICE/boot.img (where $DEVICE is your device name) it will be automatically flashed when invoking
flash.sh. Alternatively you can flash it by hand with the following commands:
adb reboot bootloader fastboot flash boot newboot.img fastboot reboot
Add the new device to flash.sh
Add the new device to
flash.sh; the specifics of how to do this will depend on what tools need to be used to flash the new device.
Configure, build, and flash the new device
Now you can try building for and flashing to your new device:
ANDROIDFS_DIR=my_device_backup ./config.sh <device_id> default.xml ./build.sh ./flash.sh
Test and debug
We need some details added here; indeed, this entire article could use some help.
- Firefox OS
- B2G source code on Github
- Android web site
- A list of existing projects on Dietrich Ayala's blog to port Firefox OS on some devices