Android ramdisk,boot,system.img 解包和打包

来源:互联网 发布:精通黑客编程 pdf 编辑:程序博客网 时间:2024/05/05 16:24

一、ramdisk介绍
ramdisk通过字面意思就大概能理解意思,ram disk虚拟内存盘,将ram模拟成硬盘来使用的文件系统。对于传统的磁盘文件系统来说,这样做的好处是可以极大提高文件访问速度;但由于是ram,所以在掉电后,这部分内容不能保存。ramdisk文件系统是在系统上电后直接从磁盘一次性加载到内存,在整个运行期间都不会有写回操作,所以,任何修改都掉电后丢失。

二、ramdisk.img介绍
ramdisk.img是编译Android生成的一个镜像文件,最后和kernel一起打包生成boot.img镜像。ramdisk.img中主要是存放android启动后第一个用户进程init可执行文件和init.*.rc等相关启动脚本以及sbin目录下的adbd工具。如下图所示
这里写图片描述

三、ramdisk.img 解压
ramdisk.img是将上图目录打包压缩而来的,我们可以通过下面命令,来解压出其中的内容
首先使用file命令查看ramdisk.img文件类型

akin@akin:~/work/7722$ file ramdisk.img ramdisk.img: gzip compressed data, from Unix

将ramdisk.img 重命名为gzip格式

akin@akin:~/work/7722$ mv ramdisk.img ramdisk.img.gzakin@akin:~/work/7722$ lsramdisk.img.gz

使用gzip解压ramdisk.img.gz文件

akin@akin:~/work/7722$ gunzip ramdisk.img.gz 

再次用file命令查看文件类型

akin@akin:~/work/7722$ file ramdisk.img ramdisk.img: ASCII cpio archive (SVR4 with no CRC)

这时候使用cpio来提取ramdisk.img中的内容

//新建目录 用来保存解出来的文件akin@akin:~/work/7722$ mkdir tempakin@akin:~/work/7722$ cd temp/akin@akin:~/work/7722/temp$ cpio -i -F ../ramdisk.img 4783 blocks

四、ramdisk.img 压缩
修改相应要修改的文件后,打包成ramdisk.img文件的步骤如下:

akin@akin:~/work/7722/temp$ find .|cpio -ov -H newc | gzip > ../ramdisk.img ../factory_init.rc./proc./sepolicy./init.recovery.mt6735.rc./file_contexts./selinux_version./ueventd.rc./sys./meta_init.modem.rc./property_contexts./init.aee.rc./sbin./sbin/mkfs.f2fs./sbin/watchdogd./sbin/adbd./sbin/healthd./sbin/ueventd./data./init.modem.rc./init.xlog.rc./meta_init.project.rc./charger./enableswap.sh./init.project.rc./init.zygote64_32.rc./default.prop./init.ssd.rc./dev./factory_init.project.rc./system./init./init.zygote32.rc./service_contexts./fstab.mt6735./init.trace.rc./seapp_contexts./init.mt6735.usb.rc./init.rc./meta_init.rc./init.environ.rc./init.mt6735.rc./init.usb.rc4784 blocksakin@akin:~/work/7722/temp$ cd ..akin@akin:~/work/7722$ lsramdisk.img  temp

system.img 解压、修改、
将system.img 转换成ext4 格式,然后挂载到/home/temp/目录 就可以修改了

akin@akin-machine:~/tools/system$ simg2img system.img system.img.ext4akin@akin-machine:~/tools/system$ sudo mount system.img.ext4 ~/temp/akin@akin-machine:~/tools/system$ sudo umount ~/temp/

打包

akin@akin-machine:~$ make_ext4fs -s -l 604M -a system system.img temp/Creating filesystem with parameters:    Size: 633339904    Block size: 4096    Blocks per group: 32768    Inodes per group: 7744    Inode size: 256    Journal blocks: 2416    Label:     Transparent compression: none    Blocks: 154624    Block groups: 5    Reserved block group size: 39Created filesystem with 1212/38720 inodes and 67353/154624 blocks    Total files: 1085    Total bytes: 252503255akin@akin-machine:~$ ls8085Q    Desktop    examples.desktop  Pictures    temp       Videosandroid  Documents  Music             Public      Templatesbin      Downloads  -n                system.img  tools

recovery.img

1.获取recovery.img
第一种:从原厂刷机包中提取recovery.img
第二种:从手机上面提取

 root手机 adb shell  su 1.如果是高通芯片的手机,采用以下命令将recovery.img拷贝出来 dd if=/dev/block/platform/msm_sdcc.1/by-name/recovery of=/storage/sdcard/recovery.img 或者是: cd /dev/block/flatform/msm_sdcc.1/by-name/ ls -al命令可以看到revoery其实是个链接文件,链接到/dev/block/mmcblk0p*  这个分区块,因此也可以使用一下命令: dd if=/dev/block/mmcblk0p16 of=/storage/sdcard/recovery.img
2.如果是MTK芯片的手机有两种方式:dd if=/dev/recovery of=/storage/sdcard/recovery.img bs=1024 count=6144dd if=/dev/block/mmcblk0 of=/storage/sdcard/recovery.img skip=xxxx bs=1024 count=6144注意:bs的值目前可以固定1024count的值需要查看cat /proc/dumchar_info文件对应的recovery大小来确定(高通平台没有dumchar_info这个文件),比如size一列为0x600000,那么count的值为6144,也就是6M,如果为0x700000,那么count的值为7168,也就是7M大小。skip代表偏移,因为MTK平台recovery和boot等都在一个相同的分区中,通过地址偏移量来区分,这就是为什么高通平台不需要执行bs 和count的原因。

解包

#./mkboot recovery.img outFilePath

打包

./mkboot outFilePath recovery.img
0 0
原创粉丝点击