文章介绍的内容在这个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的基本方法。同样,我不确定什么时间,最近学业忙得要死。我尽量抽空写。
两个脚本下载不了了
两个方法 我都试过了 hero 就是开不了机器 卡在 黑色 HERO 界面
真郁闷
Sorry, 脚本下不了好像是我的问题,你可以去网上搜一下
Hero几乎是不能成功的,因为HTC自己改了源代码
这个不能成功,是指哪方面?
請問下面二行是否是在手機連接usb,在電腦終端機執行?
adb shell中
cat /dev/mtd/mtd2 > /sdcard/root.img
Yes, go into adb shell and execute this
kernel部分可以修改么??
请问,我在提取时,使用 |./split_bootimg.pl boot.img 命令时,打印出“Found a secondary file after the ramdisk image. According to the spec (mkbootimg.h) this file cona exits, but htis script is noit designed to deal with this scenario.”,这是什么错误,应该怎么处理,我的boot.img,是HTC Desire的一个Rom包中的boot.img,请问这样有问题吗?还有,kernel部分可以不可以修改?
1 你的错误是脚本中的几行冲突命令导致的,注释就行了,就是下面几行
+#elsif ($numfiles > 1) {
+# die “Found a secondary file after the ramdisk image. According to the spec (mkbootimg.h) this file can exist, but this script is not designed to deal with this scenario.\n”;
+#}
2 可以改kernel,但你自己需要保证能运行成功。而且你要在你机型对应的kernel上改,而不是Google的原生kernel
再问个问题 将boot.img制作好后,与system等打包成zip文件,刷机成功,重启后会在开机画面终止,换过好几个Kernel版本,都是一样,你认为这是什么原因造成的?