文章介绍的内容在这个wiki上都有。说实话一开始我不大想写的,想直接介绍没有很多现成资料的ROM的制作,但后来考虑到最好还是层层推进,所以最终还是把这些内容写出来,作为中文参考吧。下一篇文章再介绍ROM的制作。如果你已经知道相关方法了,就没必要看了,没有什么新技术。

如果经常看我blog的朋友,应该记得前年我曾经写过一些关于Android的文章,其中一篇是对Android启动过程的进一步研究。现在要做的事情呢,就是对两年前这篇文章的一个实践了:)当然,当年的文章只能作为参考,因为那是针对模拟器的,Ramdisk.img就在Tools工具下。而现在,我们是针对真机提取Ramdisk,修改相关文件,再将其放回去,这样以后Android设备启动时,加载的都是已经修改过的Ramdisk镜像了。我们不会去直接用Tools目录下的Ramdisk,因为很可能你的Boot镜像是已经修改过的,你只不过想在其基础上进行进一步修改而已。


1提取

好,进入正题,本文主要以修改boot.img中的ramdisk为例,但是其他的修改原理都是相通的。

首先,我们要把boot镜像从设备中提取出来,方法就是在上一篇文章中谈到的,先去adb shell中

cat /dev/mtd/mtd2 > /sdcard/root.img

然后

adb pull /sdcard/root.img ./

这样就把root.img拷贝到本地目录下了。好,接下来的步骤,可要看仔细了,错了一点,就完全不对路了。

我们已经介绍过,boot.img的组成结构是

+—————–+
| boot header | 1 page
+—————–+
| kernel | n pages
+—————–+
| ramdisk | m pages
+—————–+
| second stage | o pages
+—————–+

那我们要做的就是把这几个部分分别分离出来。具体的分离原理并不是很难,就是特别麻烦。所以建议大家都用现成的脚本来做。点击unpack下载分离的脚本,点击repack下载重新打包的脚本。

好,我们现在先进行镜像分离。用命令

./split_bootimg.pl boot.img

成功执行后,可以得到两个文件,一个是boot.img-kernel,另一个是boot.img-ramdisk.gz。我们这里以修改ramdisk为例,所以将其解包

% mkdir ramdisk
% cd ramdisk
% gzip -dc ../boot.img-ramdisk.gz | cpio -i
% cd ..

解包之前新建一个文件夹放解包出来的文件,然后进入这个文件夹执行gzip和cpio的命令。至于原理,同上,请参考两年前的这篇文章

2 生成新img

好,接下来你就可以做你想做的任何修改了,包括init.rc之类的进程方面的修改,或者丢一个什么东西进去,或者其他。只需要确保你做的修改没有问题就行。修改完成后,自然就是要将其重新还原成img包了,这时repack脚本就派上用场。用命令

repack-bootimg.pl boot-new.img

就可以生成新的boot-new.img了。

3 刷入新img

生成了新的img后,我们如何在系统上应用我们的新boot.img呢?首先,把img文件放到sdcard上去

adb push ./boot_new.img /sdcard

然后执行这两个操作

# cat /dev/zero > /dev/mtd/mtd2
# flash_image boot /sdcard/mynewimage.img

执行第一个操作时,可能会提示你

write: No space left on device

这个信息没关系,不用管它。两个命令都执行后,最后adb shell reboot即可。如果重启顺利,那么恭喜你,你的新镜像刷成功了,此时的ramdisk自然也是新的ramdisk了。

4 刷boot镜像有问题?

其实到这里,才是俺想发挥的地方。上面介绍的所有步骤,有两个特点

4.1 国外友人上都介绍过
4.2 G1上成功率最高

所以如果你是用Magic或者Hero,有一定几率会出线重启之后,画面就停留在 HTC 或者Android那里,不会进入系统。此时你必须拿出电池重新开机,按照我这篇文章所讲的方法刷一次recovery image,才能正常进入系统。如果你真的遇到这种情况,就说明上面介绍的这个方法不适合你,那么,还有没有别的方法让系统boot我们自己的boot image呢?

当然有。在这篇文章中,我们介绍了有很多第三方ROM供我们刷机,从而达到更多功能或者获得root权限的目的。其中,我们介绍了里面有一个update.zip的东西,如果亲自刷过机的朋友就知道这是什么文件。我同时也介绍了,update.zip里面就是要添加到你的system中的各种工具,其中就包括了boot.img。也就是说,我们可以自己做一个属于自己的ROM,其中包括我们自己的boot.img。

所以在下篇文章中,我会介绍自己制作ROM的基本方法。同样,我不确定什么时间,最近学业忙得要死。我尽量抽空写。