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

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

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

三、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.gz
akin@akin:~/work/7722$ ls
ramdisk.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 temp
akin@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.rc
4784 blocks
akin@akin:~/work/7722/temp$ cd ..
akin@akin:~/work/7722$ ls
ramdisk.img  temp

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

akin@akin-machine:~/tools/system$ simg2img system.img system.img.ext4
akin@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: 39
Created filesystem with 1212/38720 inodes and 67353/154624 blocks
    Total files: 1085
    Total bytes: 252503255
akin@akin-machine:~$ ls
8085Q    Desktop    examples.desktop  Pictures    temp       Videos
android  Documents  Music             Public      Templates
bin      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=6144
dd 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

你可能感兴趣的:(android)