注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

简洁即美

最简洁的手法保存记忆

 
 
 

日志

 
 

【引用】如何修改Android系统的Ramdisk以及boot镜像  

2012-01-05 16:16:11|  分类: Android |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

原文: http://www.kunli.info/2009/09/14/how-to-modify-ramdisk-android/

文章介绍的内容在这个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的基本方法。同样,我不确定什么时间,最近学业忙得要死。我尽量抽空写。

Alternative Method

Download split_bootimg.zip . This Zip file contains one Perl file, split_bootimg.pl, which reads the boot.img header (according to the bootimg.h of the Android source code) to extract the kernel and ramdisk. The script also outputs the kernel command line and board name (if specified).

(Note: Do not use a boot.img image extracted directly from /dev/mtd/mtd2. This image may become corrupted during the read process.)

The following example uses the boot.img from the full TC4-RC28 update:

% ./split_bootimg.pl boot.img  Page size: 2048 (0x00000800) Kernel size: 1388548 (0x00153004) Ramdisk size: 141518 (0x000228ce) Second size: 0 (0x00000000) Board name:  Command line: no_console_suspend=1 Writing boot.img-kernel ... complete. Writing boot.img-ramdisk.gz ... complete. 

Extract the ramdisk.

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

Make any changes necessary (e.g., set ro.secure=0 in default.prop).

Recreate the cpio archive using the mkbootfs binary produced from building the Android source code (The cpio utility in OS X does not recognize the newc format, therefore mkbootfs is the best option for OS X users).

% mkbootfs ./ramdisk | gzip > ramdisk-new.gz 

Recreate the image file using the mkbootimg binary produced from building the Android source code.

% mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel boot.img-kernel --ramdisk ramdisk-new.gz -o boot-new.img 

For Nexus One : Add --base 0x20000000 to mkbootimg command-line.


(Note: the console=null command line option was introduced in the TC4-RC30 boot images to remove the root shell (TODO: add link))

  评论这张
 
阅读(93)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017