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