将B2G(Firefox OS)移植到你的手机上

3 位贡献者:

Boot to Gecko (Firefox OS)使用 Android的核心驱动, 在之上加上一个基于 Gecko的用户界面,这篇文章提供了移植操作系统到新设备上的一个基本流程。

这个指南假设你要移植的新设备上运行的是安卓;如果你要移植到其他设备上,会需要做更多的工作。

设置你的编译系统

第一步是配置你的编译系统;你可以使用这个指南Firefox OS build prerequisites

克隆B2G仓库

然后就是克隆B2G仓库

git clone https://github.com/mozilla-b2g/B2G.git

创建原安卓系统的本地备份

接下来,在你尝试编译B2G之前,应该备份你的安卓系统,另外,这些东西在编译和安装过程中也能用的到。

mkdir my_device_backup
cd my_device_backup
adb pull /system system

在config.sh中添加一个新设备

下一步是向config.sh文件中添加一个新设备;你可以使用已存在的设备作为模板,这仅仅是提供编译时获取正确文件的指南。

为新设备创建清单文件

现在你需要为新设备在称为default.xml的清单文件中添加必须的仓库(repos);在github上的b2g-manifest文件作为一个模板,每一个设备都有它自己的分支,你可以使用galaxy-s2作为一个例子。

为新设备创建配置树

为新设备创建配置树,这应该在device/<manufacturer>/<device_id>中,这个树中应该至少包括:

  • AndroidBoard.mk
  • AndroidProducts.mk
  • BoardConfig.mk
  • extract-files.sh
  • full_<device_id>.mk
  • idc files for touchscreen
  • init files (init.rc, init.<target>.rc, uevent.rc, ...)

不同设备的这些内容可能会有很大的差别。尤其是BoardConfig.mk 和 extract-files.sh,这部分需要大量的研究,测试和调试才能得到哪些二进制对象应该被提取出来。

注意: 如果你可以在 CyanogenMod 上为你的设备找到一个已存在的引用,这些信息会加速你的移植过程, XDA Forum 是另一个讨论和寻找资源的好地方.

重新编译 boot.img

一旦你完成了上面所有步骤,你需要重新编译引导镜像,通常情况下,内核本身并不需要它,但是为适应init.rc的变化需要重新编译。

init.rc的变化

你使用的 init.rc 并不是B2G提供的;而是从你的设备上拷贝下来的。

你主要需要修改的是:

导入 init.b2g.rc

加入下面这些行来导入 init.b2g.rc:

on early-init
    start ueventd
    import /init.b2g.rc

解决权限问题

更正文件 /system/b2g/b2g, /system/b2g/updater, /system/b2g/plugin-container 的权限;这些行执行后挂载的系统应该可以读写:

chmod 0755 /system/b2g/b2g
chmod 0755 /system/b2g/updater
chmod 0755 /system/b2g/plugin-container

你可能想要从修改新设备的init.rc开始,而不是使用编译系统提供的init.rc,如果是这样,你要记得设置 BoardConfig.mk中的TARGET_PROVIDES_INIT_RC.

预编译核心 vs. 从源代码编译核心

你可以使用一个预编译的核心,或者你可以从源代码编译核心,要从源代码编译核心,在设备配置树中添加AndroidKernel.mk和核心配置。

旧编译系统 maguro 就是一个从源代码编译系统的例子。

提取并修改现存引导镜像

通过转存/dev/mtd/mtd1或 /dev/mtd/mtd2设备来恢复手机的引导镜像是可能的,成果镜像文件可以很容易的恢复:

adb shell 'cat /dev/mtd/mtd1 > /sdcard/boot.img'
adb pull /sdcard/boot.img

 

获得了引导镜像文件之后你就可以通过帮助工具像unmkbootimg来解压,这个工具会解压出核心镜像(zImage)和虚拟磁盘(initramfs.cpio.gz),而且还会输出一个用于将原镜像带一些参数重新编译的命令,如:

$ 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
---------------

 

要修改虚拟磁盘文件,创建一个输出文件夹并解压到此:

mkdir initramfs_dir
cd initramfs_dir
gunzip -c /path/to/your/boot.img | cpio -i

 

完成所有改变(如修改init.rc)并用mkbootfs重新打包虚拟磁盘,确保使用B2G主机工具的版本:

/path/to/your/B2G/out/host/linux-x86/bin/mkbootfs initramfs_dir | cpio -o -H newc | gzip > ../newinitramfs.cpio.gz

 

最后使用mkbootimg重新打包引导镜像,也要确保使用的是B2G主机工具的版本:

/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

 

如果你现在把新的引导镜像拷贝到 out/target/product/$DEVICE/boot.img ($DEVICE 是你的设备名称)下,它将会在调用 flash.sh时自动写入,或者你可以用下面的命令手动写入手机中:

adb reboot bootloader
fastboot flash boot newboot.img
fastboot reboot

 

在 flash.sh中添加新设备

添加新设备到 flash.sh中,具体细节将取决于写入新设备时所用的工具。

配置、编译和写入设备

现在你可以尝试编译并写入你的新设备了:

ANDROIDFS_DIR=my_device_backup ./config.sh <device_id> default.xml
./build.sh
./flash.sh

测试和调试

待续

FAQ

Forthcoming

See also

文档标签和贡献者

向此页面作出贡献: baiyangcao, ziyunfei, iwo
最后编辑者: baiyangcao,
隐藏侧边栏