Please note, this is a STATIC archive of website developer.mozilla.org from 03 Nov 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

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

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

文档标签和贡献者

 此页面的贡献者: chrisdavidmills, baiyangcao, ziyunfei, iwo
 最后编辑者: chrisdavidmills,