下载工具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”
od命令主要用来查看文件中不能直接显示在终端的字符

  • -A x表示地址用十六进制显示
  • -A d表示地址用十进制显示
  • -t x1表示十六进制的输出格式
地址用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打开压缩文件,打开查找功能来定位

android img镜像解包 img镜像解包工具手机_服务器

去除前面512字节的数据:

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

  • bs=512,bs即blocks,就是一次操作块的大小是512字节
  • skip=1,忽略第一个块(512字节)(也可以块大小1字节,然后skip=512)
  • count=xxx,读取多少个bs,不指定则是全部
$ 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
或在备份时加上d参数

(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个不如意的地方:

1、不能直观地提供base地址

2、会造成512字节的丢失

3、步骤较多

4、解压boot.img-ramdisk.gz后少了一个总文件夹initrd

android img镜像解包 img镜像解包工具手机_bc_02


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