出自https://blog.csdn.net/whu_zhangmin/article/details/24733677

本文以recovery.img为例来讲解说明,boot.img类似

1、获取recovery.img

首先将手机root,一般使用360一键root或者百度一键root,这是一种软件层面的root,无非是利用android漏洞在/system/app下植入一个superuser.apk来掌管root权限,每次用户需要root权限时,使用su命令,界面会弹出对话框要求确认。下面还会讲到另一种root,把它叫做内核root,也就是default.prop这个文件中两个属性值:

ro.secure=0

ro.debuggable=1

内核root之后,adb shell直接是root用户登录,而软件层面root,adb shell依然是shell用户登录,必须通过su命令切换到root用户($ 符号变成#)。

一般我们如果不是手机厂商用户,刚开始只能是软件层面的root。

adb shell

su

切换到root用户后

1)如果是高通芯片的手机,采用以下命令将recovery.img拷贝出来

dd if=/dev/block/platform/msm_sdcc.1/by-name/recovery of=/storage/sdcard/recovery.img

ps:cd  /dev/block/platform/msm_sdcc.1/by-name 到这个目录下ls -al命令可以看到revoery其实是个链接文件,链接到/dev/block/mmcblk0p16  这个分区块,因此也可以使用一下命令:

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的值目前可以固定1024,count的值需要查看cat /proc/dumchar_info文件对应的recovery大小来确定(高通平台没有dumchar_info这个文件),

比如size一列为0x600000,那么count的值为6144,也就是6M,如果为0x700000,那么count的值为7168,也就是7M大小。

skip代表偏移,因为MTK平台recovery和boot等都在一个相同的分区中,通过地址偏移量来区分,这就是为什么高通平台不需要执行bs 和count的原因。

3)如果手机是Nvidia芯片

ddif=/dev/block/platform/sdhci-tegra.3/by-name/SOS of=/storage/sdcard/recovery.img 

 

2、解压缩recovery.img

网上很多文章有关解压缩和重新打包压缩recovery.img的,利用perl脚本split_bootimg.pl 来解压缩,但本人试验过,解压缩还行,重新打包就完全不行,生成的recovery.img根本没法用。

recovery.img中主要包含内核recovery.img-kernel和根文件系统recovery.img-ramdisk.gz两个东西。

这一步依然要区分MTK平台和非MTK平台

1)对于MTK平台,过程稍微多一步

 

./split_bootimg.pl $1

 

//如果是非MTK平台就不需要这一段代码
filename=`basename $1`
echo $filename.....
dd if="$filename-ramdisk.gz" of="$filename-ramdisk.tmp.gz" skip=512 bs=1
mv "$filename-ramdisk.gz" "$filename-ramdisk.gz.full"
mv "$filename-ramdisk.tmp.gz" "$filename-ramdisk.gz"


rm -fr ramdisk_bak
mv ramdisk ramdisk_bak
mkdir -m 777 ramdisk
cd ramdisk
gzip -dc ../$1-ramdisk.gz | cpio -i
cd ../
chmod 777 -R ramdisk
View Code

 

 

$1代表传入的参数recovery.img

执行这段脚本代码后,屏幕会打印类似

Page size: 2048 (0x00000800)
Kernel size: 4285080 (0x00416298)
Kernel addr: 268468224 (0x10008000)
Ramdisk size: 1712833 (0x001a22c1)
Ramdisk addr: 285212672 (0x11000000)
Second size: 0 (0x00000000)
tag addr: 268435712 (0x10000100)
dt size: 0 (0x00000000)
Board name: 
Command line: 
dt: 0 (0x00000000)
dt_offset: 6002688 (0x005b9800)
Writing revocery.img-kernel ... complete.
Writing revocery.img-ramdisk.gz ... complete.

 

解压之后在当前目录下就生成了ramdisk目录,里面就是根文件系统

 

2)对于非MTK平台,比如高通平台

./split_bootimg.pl $1

rm -fr ramdisk_bak
mv ramdisk ramdisk_bak
mkdir -m 777 ramdisk
cd ramdisk
gzip -dc ../$1-ramdisk.gz | cpio -i
cd ../
chmod 777 -R ramdisk
View Code

 

 

 

 

执行解压后会输出如下:

Page size: 2048 (0x00000800)
Kernel size: 6471072 (0x0062bda0)
Kernel addr: 32768 (0x00008000)
Ramdisk size: 1995775 (0x001e73ff)
Ramdisk addr: 33554432 (0x02000000)
Second size: 0 (0x00000000)
tag addr: 31457280 (0x01e00000)
dt size: 5046272 (0x004d0000)
Board name: 
Command line: console=none androidboot.hardware=qcom user_debug=31 msm_rtb.filter=0x37 ehci-hcd.park=3 restart.panic_to_dload=0 restart.download_mode=0
dt: 2464 (0x000009a0)
dt_offset: 8470528 (0x00814000)
Writing recovery.img-kernel ... complete.
Writing recovery.img-ramdisk.gz ... complete.
Writing recovery.img-dt.gz ... complete.
6640 blocks

注意上面的输出内容:Kernel addr,Ramdisk addr,Command line 以及dt size(可能为0)

Kernel addr = base addr + 0x8000

Ramdisk offset = Ramdisk addr - base addr

Ramdisk addr =base+0x2000000

tag addr =base+0x100

这里base addr为0x00000000,Ramdisk offset 为0x02000000,注意还生成了一个recovery.img-dt.gz

同样也生成了ramdisk目录,可以替换sbin目录下的可执行文件,换成自己定制的recovery,同样的打开build.prop可以修改内核root的两个属性

ro.secure=0

ro.debuggable=1

注意,改这两个属性在boot.img中,并重新打包刷到手机中,就能实现内核root了。

 

3、重新压缩打包recovery.img

1)对于非MTK平台:

//将ramdisk目录打包成ramdisk-new.gz压缩包

rm -fr ramdisk-new.gz
./mkbootfs ./ramdisk | gzip > ramdisk-new.gz

rm -fr recovery-new.img
./mkbootimg --cmdline 'console=none androidboot.hardware=qcom user_debug=31 msm_rtb.filter=0x37 ehci-hcd.park=3 restart.panic_to_dload=0 restart.download_mode=0' --kernel recovery.img-kernel --ramdisk ramdisk-new.gz --base 0x00000000 --pagesize 2048 --ramdisk_offset 0x02000000  --dt recovery.img-dt.gz -o recovery-new.img

注意看命令,在第二步中计算过的--base 0x00000000 --pagesize 2048 --ramdisk_offset 0x02000000值都用上了,同时加上--dt命令(有些recovery.img也没有包含dt文件,这种情况下就不需要--dt参数)

2)对于MTK平台

就不需要上面计算的参数,直接

./repackMTK.pl -recovery recovery.img-kernel ramdisk recovery-new.img

 

4、接下来就是重新烧到手机中验证了,可以通过fastboot来烧写,可以参考我的上一篇记录Android 采用fastboot刷system.img boot.img recovery.img

posted on 2020-09-22 14:19  陌鉎こ城sHi  阅读(1116)  评论(0编辑  收藏  举报