ramdisk.img 是你make android源代码后,生成的/out/target/product/generic/root目录下经过打包压缩而成的。
system.img 是你make android源代码后,生成的/out/target/product/generic/system目录下经过打包压缩而成的。
userdata.img 是你make android源代码后,生成的/out/target/product/generic/data目录下经过打包压缩而成的。
android系统起来后,会把ramdisk.img挂载为rootfs(根文件系统),system.img挂载到ramdisk.img的system文件下, userdata.img挂载到ramdisk.img的data目录下。
当建立好了开发环境后(eclipse+ADT+SDK),启动eclipse中的虚拟设备,其默认的Android镜像文件位于SDK 目录system-images文件下,当然有不同的等级,我的目录如下:android-sdk-linux/system-images/android-15/armeabi-v7a/。其中除了3个.img文件外,还有一个kernel-qemu,它是linux内核文件,其他的文件都没有什么作用。这个3个文件都可以用你自己生成的文件代替。
下面开始解压这三个文件,在开始修改前,提醒一下,要备份你的文件。
首先从最难的ramdisk.img开始,你别看它和其他两个的后缀是一样,其实它跟它们不是同一样的文件格式,从后面的操作就可以看出。
解压:
1. 新建文件夹 :mkdir tmp tmp/ramdisk tmp/system tmp/userdata.
2. 拷贝ramdisk.img到tmp,cd tmp
3. mv ramdisk.img ramdisk.img.gz
4. gunzip ramdisk.img.gz
5. cd ramdisk
6. cpio -i -F ../tmp/ramdisk.img
这样,ramdisk的文件就都解压到ramdisk里面了。
修改:
1. 开机用root登录系统,修改init.rc 文件中的:
service console /system/bin/sh
class core
console
disabled
user shell
group log
user shell 改为user root。
2. 更改为可写文件,修改init.rc 文件中的:
on fs
# mount mtd partitions
# Mount /system rw first to give the filesystem a chance to….
mount yaffs2 mtd@system /system
mount yaffs2 mtd@system /system
ro remount
mount yaffs2 mtd@userdata /data nosuid nodev
mount yaffs2 mtd@cache /cache nosuid nodev
on post-fs
# once everything is setup, no need to modify /
mount rootfs rootfs /
ro remount
将只读 ro 改为rw可读写。当然,这些有可能不在这个文件里,那肯定再xxx.rc 里面,xxx.rc有很多可以改的,它们可以配置系统的服务。修改好了后,进行压缩。
打包:
方法一:
1.用mkrootfs制作ramdisk.img,mkrootfs 是android生成的命令:out/host/linux-x86/bin/mkbootfs,可以将此命令拷贝到tmp目录下,在tmp下执行:mkbootfs ramdisk | gzip ramdisk.img.
方法二:
在tmp/ramdisk执行:
cpio -i -t -F ../ramdisk.img | cpio -o -H newc -O ./ramdisk_new.img
gzip ramdisk_new.img
mv ramdisk_new.img.gz ramdisk.img
这样新的img就制作成功了,可以用其代替原来的了。
system.img 以及userdata.img,因为这两个文件是一样的格式,所以一起说明。
解压:
它们都是yaffs2 格式的文件,要解压yaffs2文件,需要用到uyaffs,这个网上有源码,我 csdn 资源上也有,要的可以去下载。执行:
uyaffs2 system.img
uyaffs2 userdata.img
就会生成对应的文件夹:system、uersdata.系统预装的apk在system/app下,可以删除不需要的apk。
打包:
使用mkyaffs2image能对yaffs2文件打包,android也会生成:out/host/linux-x86/bin/mkyaffs2image,用法如下:
mkyaffs2image tmp/system/ system.img
mkyaffs2image tmp/userdata userdata.img
生成img 后,就可以用它们替换原来的了。
1.用file命令查询文件类型
file ramdisk.img --> ramdisk.img: gzip compressed data, from Unix
file system.img --> system.img: VMS Alpha executable
file system.img --> userdata.img: VMS Alpha executable
结论:ramdisk.img用gzip打包和解压,file system.img和file system.img用unyaffs解压,用mkyaffs2image压缩而成.
2.mkyaffs2image可在out文件夹里查找到(注意是要在编译成功后的out里查找) find out -name mkyaffs2image
unyaffs下载地址: http://code.google.com/p/tookubuntu/downloads/detail?name=unyaffs.tar.gz&can=2&q=
将上述五个文件拷入同一文件夹,以便操作...
3.gunzip ramdisk.img.gz解压之后,我们发现它是一个小型的文件系统,包含一些对于启动android的很重要的文件,比如内核启动完后加载的第一个进程init、一些重要的配置文件等,总之它控制着整个android的启动。根据 init.rc,init.goldfish.rc来初始化并装载系统库、程序等直到开机完成。init.rc脚本包括了文件系统初始化、装载的许多过程。init.rc的工作主要是:
1)设置一些环境变量
2)创建system、sdcard、data、cache等目录
3)把一些文件系统mount到一些目录去,如,mount tmpfs tmpfs /sqlite_stmt_journals
4)设置一些文件的用户群组、权限
5)设置一些线程参数
6)设置TCP缓存大小
4.解压system.img
./unyaffs system.img
android的应用程序,所需要的库文件,各种资源,framework jar库等均包含在system.img中.
5.解压userdata.img
./unyaffs userdata.img
这里包含部分不太重要的应用程序