转载ramdisk.imgsystem.imguserdata.img介绍与解包、打包方法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ramdisk.img system.img userdata.img介绍及解包、打包方法2011-11-25 11:37:24

分类:

ramdisk.img system.img userdata.img介绍及解包、打包方法

Android 源码编译后,在out/target/product/generic下生成的三个镜像文件:ramdisk.img,system.img,userdata.img以及它们对应的目录树root,system,data。ramdisk.img是根文件系统,system.img包括了主要的包、库等文件,userdata.img包括了一些用户数据,android加载这3个映像文件后,会把system和userdata分别加载到ramdisk文件系统中的system和data目录下。

三个镜像文件及其三个目录树之间的生成关系是我们进行ROM制作的基础,下面将做详细介绍。Ramdisk镜像是采用cpio打包,gzip压缩的。用file验证:

# file ramdisk.img

输出: # ramdisk.img: gzip compressed data, from Unix

为了便于说明问题,我们将ramdisk.img拷贝到其它一个目录,然后按以下步骤将ramdisk.img还原为目录树:

# mv ramdisk.img ramdisk.img.gz

# gunzip ramdisk.img.gz

# mkdir ramdisk

#cd ramdisk

#mkdir temp

#cd temp

# cpio –i –F ../ramdisk.img

这样,就得到一个完整的ramdisk目录,与out/target/product/generic/root对比后,我们发现它们是一样的内容。

通过执行以下的操作,我们可由目录树再生成ramdisk镜像

# cd temp

# find . | cpio -o -H newc | gzip > ../ramdisk-new.img 这两个镜像都属于yaffs2文件格式,生成方式是一样的。我们就以system.img为例来说明。

System.img >> system目录树所需工具unyaffs, 下载地址/unyaffs/downloads/list # mkdir system

# cd system

# unyaffs ../system.img

system目录树>> system.img

所需工具mkyaffs2image,Android源码编译后会生成该工具,在

out/host/linux-x86/bin 目录下。

命令格式:

# mkyaffs2image system/ system_new.img

了解以上方法的意义在于,我们可以对镜像文件镜像修改,定制,以符合自己的需求。网上有很多制作Android ROM的教程,这里罗列一些链接:

北理工的陈罡写的两篇文章,是我目前发现的最好的教程,写的非常详细

/26691/showart_2193396.html

/26691/showart_2194274.html

这两篇文章参考了国外论坛的几个经典教程:

/showthread.php?t=566235

/wiki/inde ... Re-Pack_Boot_Images

国内还有一篇文章写的也不错,这篇文章更侧重于制作类似Patch的ROM包

/201002/00ID1030.html

这里基于自己的理解和测试,总结了一些方法步骤。

Android 的ROM包通常称为update.zip包,你可以到上下载现成的.zip 包。要学习ROM包的制作,我们可以从这样一个zip包开始。解开zip包后,通常有这样一些内容:

1、boot.img 文件这是编译内核源代码生成的内核映像,然后与android源码编译出来的ramdisk.img一起通过mkbootimg工具创建出来的,图省事的朋友也可以从网上其他的刷机包里面拷贝一个能用的出来即可,基本上都差不多。

2、 META-INF目录这个目录是手工创建的,主要用来存放一个升级脚本update-script(这个脚本的内容与system目录中包含的文件有很大关联)以及签名。

3、system 目录这个目录就是编译android的平台源代码生成的

要创建自己的ROM,我们通常会涉及到以下的一些工作:

1.编译内核生成内核映像。但一般情况下,我们没有必要自己去编,直接从刷机包里面取出一个就可以。譬如,你要做一个2.2版本的升级包。可以到网上找一个与自己机型相

匹配的刷机包,从里面取出相应的kernel.img。

2.ramdisk.img的修改。ramdisk.img 是根文件系统,Ugg boots,里面包含了启动配置脚本。

3.update-script的修改。

4.System的修改。

详细的步骤可以参考/26691/showart_2194274.html。我们先做个简单的测试工作,来为后面更复杂的工作做好铺垫。测试内容为:先对zip进行解包,然后分别在ramdisk和system的根目录下添加一个小文件,接着,生成新的ROM,并验证ROM是否可用。

这里要指出的是,这篇文章以及网上许多类似网站提到的方法都是针对HTC G1或Nexus one的。而我在测试的时候,用的是HTC G3 Hero。以上的方法导致的一个后果是,重新打包后再烧录,机器无法正常启动,adb shell也无法登陆。后来在国外的一篇博客上看到了对此问题的说明,问题的根源很简单,从G3开始,打包的时候需要指定“--base”参数。对于Hero,参数为”--base 0x”,但对于其它型号的机器,”--base"要设定为多少,需要参考内核代码的实现。

解包打包可用两个脚本完成unpack-bootimg.pl, repack-bootimg.pl。其中打包脚本用到的mkbootimg工具,在out/host/linux-x86/bin目录下。unpack-bootimg.pl可直接将boot.img生成内核镜像boot.img-kernel和ramdisk目录树boot.img- ramdisk。

repack-bootimg.pl可将boot.img-kernel和boot.img-ramdisk重新生成boot.img。

在解包后,我们在ramdisk和system目录下,各添加一个测试小文件(譬如叫mytest)。做完这些开始组包,重新生成update.zip。到这里我们的工作并没有完全结束,还有最后的一步——签名。签名需要用到签名工具testsign.jar,这是一个基于java 1.6版本的工具。在编译Android源码的时候,我们强调要用java 1.5。在这里,我们必须切换到1.6版本。

1)重新生成boot.img

将前面解包得到的boot.img-ramdisk 和编译源码后out/target/product/generic/下的root目录树放在一个目录下,然后用repack-bootimg.pl重新生成boot.img

2) 创建一个目录myupdate,将上面生成的boot.img放到这个目录下

3)将编译Android后,out/target/product/generic/生成的system目录树拷贝到myupdate目录

4)在myupdate目录下创建update-script脚本目录

# mkdir -p META-INF/com/google/android

5)删除system/bin目录下的“符号链接”,创建update-script脚本

相关文档
最新文档