下载工具split_bootimg.pl :

此脚本在github很多,如gist.github.com/amartinz/84c7ebc64f126bd6b3a8

用split_bootimg.pl解包boot.img:

命令:split_bootimg.pl boot.img

$ ls boot.img split_bootimg.pl $ ./split_bootimg.pl boot.img Page size: 2048 (0x00000800) Kernel size: 4113352 (0x003ec3c8) Ramdisk size: 682322 (0x000a6952) Second size: 0 (0x00000000) Board name: 27 Command line: product.version=PD1304BT_A_1.10.0 Writing boot.img-kernel ... complete. Writing boot.img-ramdisk.gz ... complete.

以上数据中的page size , command line在打包时会用到(应该还有个base, padding size的,这里好像没有)

得到2个文件:

boot.img-kernel , boot.img-ramdisk.gz

$ ls boot.img boot.img-kernel boot.img-ramdisk.gz split_bootimg.pl

解压boot.img-ramdisk.gz :

问题:gzip: boot.img-ramdisk.gz: not in gzip format

$ gzip -d boot.img-ramdisk.gz gzip: boot.img-ramdisk.gz: not in gzip format

明明是gz文件却解压不了,此时把压缩文件格式标记1f 8b 08之前的数据去掉即可。

查看文件属性:

$ file boot.img-ramdisk.gz boot.img-ramdisk.gz: data

gz压缩文件的起始标记是:1f 8b 08

我们可以通过以下两种方式定位此标记:

第一种:

二进制数据查找命令:

od -A x -t x1 boot.img-ramdisk.gz | grep "1f 8b 08"

地址用16进制: $ od -A x -t x1 boot.img-ramdisk.gz | grep "1f 8b 08" 000200 1f 8b 08 00 00 00 00 00 00 03 ec bc 79 7c 54 45 地址用10进制: $ od -A d -t x1 boot.img-ramdisk.gz | grep "1f 8b 08" 0000512 1f 8b 08 00 00 00 00 00 00 03 ec bc 79 7c 54 45

地址为0000512说明标记出现在第513个字节处(0开始的),去掉前面512字节的数据即可

第二种:

用WinHex打开压缩文件,打开查找功能来定位

安卓utm虚拟机安装教程(手机启动镜像boot.img的解包)(1)

去除前面512字节的数据:

命令:dd if=./boot.img-ramdisk.gz of=ramdisk.gz bs=512 skip=1

参数说明:

$ dd if=./boot.img-ramdisk.gz of=ramdisk.gz bs=512 skip=1 1331 1 records in 1331 1 records out 681810 bytes (682 kB, 666 KiB) copied, 0.0155042 s, 44.0 MB/s $ ls boot.img boot.img-kernel boot.img-ramdisk.gz ramdisk.gz split_bootimg.pl

查看文件格式:

$ file ramdisk.gz ramdisk.gz: gzip compressed data, from Unix, original size modulo 2^32 1235968

用xxd命令查看文件头:

$ xxd -l 64 newramdisk.gz 00000000: 1f8b 0808 6f6a 7e62 0003 6e65 7772 616d ....oj~b..newram 00000010: 6469 736b 00ec 3c6d 6c1c c775 4b8a b6a4 disk..<ml..uK... 00000020: b35d cbb6 5c18 707e 8cc5 36a1 6af2 f648 .]..\.p~..6.j..H 00000030: 93d4 474d 4114 8f27 b116 4596 a46c 0528 ..GMA..'..E..l.(

解压ramdisk.gz :

-d 表示解压

$ gunzip ramdisk.gz 或 $ gzip -d ramdisk.gz

解包后生成新文件ramdisk

文件格式变为ASCII cpio archive :

$ file ramdisk ramdisk: ASCII cpio archive (SVR4 with no CRC)

还原备份的数据:

命令:cpio -i ../ramdisk

$ mkdir ram $ cd ram $ cpio -i ../ramdisk 2414 blocks

还原出来的文件:

$ ls data init.modem.rc meta_init.rc default.prop init.no_ssd.rc proc dev init.project.rc res enableswap.sh init.protect.rc sbchk factory_init.project.rc init.rc sbin factory_init.rc init.trace.rc sys fstab init.usb.rc system init init.vivo.rc ueventd.goldfish.rc init.aee.customer.rc init.xlog.rc ueventd.rc init.charging.rc meta_init.modem.rc init.goldfish.rc meta_init.project.rc

gzip -d ramdisk.gz和cpio -i ../ramdisk两步可以用以下一步替代:

gzip -dc ../ramdisk.gz | cpio -i

c参数表示输出到标准输出

=====================================

修改后重新打包:

在ram中加一个测试文件test.txt,然后重新打包

(1)先备份:

命令:find . -depth | cpio -ov -F ../newramdisk

find . -depth | cpio -ov > ../newramdisk

-F用来指定文件名

$ find . -depth | cpio -ov -F ../newramdisk ./data ./default.prop ./dev ./enableswap.sh ./factory_init.project.rc ./factory_init.rc ./fstab ./init ./init.aee.customer.rc ./init.charging.rc ./init.goldfish.rc ./init.modem.rc ./init.no_ssd.rc ./init.project.rc ./init.protect.rc ./init.rc ./init.trace.rc ./init.usb.rc ./init.vivo.rc ./init.xlog.rc ./meta_init.modem.rc ./meta_init.project.rc ./meta_init.rc ./proc ./res ./sbchk/sbchk ./sbchk/sec_chk.sh ./sbchk ./sbin/adbd ./sbin/e2fsck ./sbin/meta_tst ./sbin/tune2fs ./sbin/ueventd ./sbin/watchdogd ./sbin ./sys ./system ./test.txt 新加入的文件 ./ueventd.goldfish.rc ./ueventd.rc . 2408 blocks

查看备份的新文件newramdisk:

命令:cpio -vt < ../newramdisk

$ cpio -vt < ../newramdisk drwxrwx--x 1 500 513 0 May 13 16:50 data -rw-r--r-- 1 500 513 194 May 13 16:50 default.prop drwxr-xr-x 1 500 513 0 May 13 16:50 dev -rw-r--r-- 1 500 513 127 May 13 16:50 enableswap.sh -rw-r--r-- 1 500 513 0 May 13 16:50 factory_init.project.rc -rw-r--r-- 1 500 513 16566 May 13 16:50 factory_init.rc -rw-r--r-- 1 500 513 594 May 13 16:50 fstab -rwxr-x--- 1 500 513 167004 May 13 16:50 init -rwxr-x--- 1 500 513 411 May 13 16:50 init.aee.customer.rc -rwxr-x--- 1 500 513 23691 May 13 16:50 init.charging.rc -rwxr-x--- 1 500 513 2583 May 13 16:50 init.goldfish.rc -rwxr-x--- 1 500 513 3044 May 13 16:50 init.modem.rc -rwxr-x--- 1 500 513 424 May 13 16:50 init.no_ssd.rc -rwxr-x--- 1 500 513 2036 May 13 16:50 init.project.rc -rwxr-x--- 1 500 513 1487 May 13 16:50 init.protect.rc -rwxr-x--- 1 500 513 50474 May 13 16:50 init.rc -rwxr-x--- 1 500 513 2126 May 13 16:50 init.trace.rc -rwxr-x--- 1 500 513 21439 May 13 16:50 init.usb.rc -rwxr-x--- 1 500 513 1131 May 13 16:50 init.vivo.rc -rwxr-x--- 1 500 513 583 May 13 16:50 init.xlog.rc -rw-r--r-- 1 500 513 689 May 13 16:50 meta_init.modem.rc -rw-r--r-- 1 500 513 1527 May 13 16:50 meta_init.project.rc -rw-r--r-- 1 500 513 10969 May 13 16:50 meta_init.rc drwxr-xr-x 1 500 513 0 May 13 16:50 proc lrwxrwxrwx 1 500 513 11 May 13 16:50 res -> /system/res -rw-r--r-- 1 500 513 83300 May 13 16:50 sbchk/sbchk -rw-r--r-- 1 500 513 497 May 13 16:50 sbchk/sec_chk.sh drwxr-xr-x 1 500 513 0 May 13 16:50 sbchk -rwxr-x--- 1 500 513 231408 May 13 16:50 sbin/adbd -rwxr-x--- 1 500 513 338440 May 13 16:50 sbin/e2fsck -rwxr-x--- 1 500 513 21856 May 13 16:50 sbin/meta_tst -rwxr-x--- 1 500 513 242212 May 13 16:50 sbin/tune2fs lrwxrwxrwx 1 500 513 7 May 13 16:50 sbin/ueventd -> ../init lrwxrwxrwx 1 500 513 7 May 13 16:50 sbin/watchdogd -> ../init drwxr-x--- 1 500 513 0 May 13 16:50 sbin drwxr-xr-x 1 500 513 0 May 13 16:50 sys drwxr-xr-x 1 500 513 0 May 13 16:50 system -rwxr-xrwx 1 Administ 513 16 May 13 22:15 test.txt 新加入的文件 -rw-r--r-- 1 500 513 272 May 13 16:50 ueventd.goldfish.rc -rw-r--r-- 1 500 513 5809 May 13 16:50 ueventd.rc drwxr-xr-x 1 500 513 0 May 13 22:14 . 2408 blocks其中

问题一

检查刚备份好的文件时出现的

cpio: premature end of file

$ cpio -cvt -F new/newramdisk cpio: premature end of file

解决:去掉c参数,即cpio -vt -F new/newramdisk

问题二:

解包刚刚做好的备份时出现的

其实是不会自动建立子目录引起

$ cpio -i < newramdisk cpio: sbchk/sec_chk.sh: Cannot open: No such file or directory cpio: sbchk/sbchk: Cannot open: No such file or directory cpio: sbin/tune2fs: Cannot open: No such file or directory cpio: sbin/meta_tst: Cannot open: No such file or directory cpio: ../init: Cannot symlink to ‘sbin/watchdogd’: No such file or directory cpio: ../init: Cannot symlink to ‘sbin/ueventd’: No such file or directory cpio: sbin/e2fsck: Cannot open: No such file or directory cpio: sbin/adbd: Cannot open: No such file or directory 2408 blocks

解决:加上d参数自动建立子目录即可,cpio -idmv < newramdisk

(2)再压缩:

命令:gzip newramdisk

以上的“先备份”、再“压缩”可用以下mkbootfs工具一步完成:

命令:./mkbootfs ./ram | gzip > newramdisk.gz

mkbootfs下载:在search.gitee.com/中查找

最后将kernel、ramdisk组合成新的boot-new.img文件:

命令:mkbootimg --kernel boot.img-kernel --ramdisk newramdisk.gz -o boot-new.img

biren@ubuntu:~/downloads$ ls boot.img-kernel mkbootfs mkbootimg new newramdisk.gz old ramdisk biren@ubuntu:~/downloads$ ./mkbootimg --kernel boot.img-kernel --ramdisk newramdisk.gz -o boot-new.img biren@ubuntu:~/downloads$ ls boot.img-kernel mkbootfs new old boot-new.img mkbootimg newramdisk.gz ramdisk

当然有必要时还要指定组合时的参数:

biren@ubuntu:~/downloads$ ./mkbootimg --help usage: mkbootimg --kernel <filename> --ramdisk <filename> [ --second <2ndbootloader-filename> ] [ --cmdline <kernel-commandline> ] [ --board <boardname> ] [ --base <address> ] [ --pagesize <pagesize> ] [ --ramdisk_offset <address> ] [ --dt <filename> ] -o|--output <filename>

如:

./mkbootimg --kernel boot.img-kernel --ramdisk newramdisk.gz --cmdline "product.version=PD1304BT_A_1.10.0" --base 0x10000000 --pagesize 2048 -o boot-new.img

另外说明 :

在这个例子中有4个不如意的地方:

安卓utm虚拟机安装教程(手机启动镜像boot.img的解包)(2)

相比较用bootimg.exe则信息全、步骤简单。

,