ubuntu下修改boot.img的方法

来源:互联网 发布:sql2012还原数据库 编辑:程序博客网 时间:2024/04/30 16:35

一下操作的前提是手机以获得root权限

1、备份boot.img

    首先 adb shell 进入手机终端,然后执行 cat /proc/mtd 命令,察看机器的分区情况。如下图:


可以看到boot分区在mtd0上。

备份boot分区:cat /dev/mtd/mtd0 >/sdcard/boot.img 将boo.img备份到了SD卡上。

2、解压boot.img

将boot.img拷贝到机器上,在机器上创建一个目录,如boot目录用来存放boot.img,

通过split_bootimg.pl脚本文件对boot.img进行解压。

将split_bootimg.pl文件也放到刚才创建的boot目录,然后执行 ./split_bootimg.pl boot.img,这是会在该目录下生成两个文件,

一个文件是boot.img-kernel,这个就是kernel的镜像文件Image

另一个文件是boot.img-ramdisk.gz  这个文件就是ramdisk.img,也就是编译出来的out/target/product/你的产品名目录/    目录下的root 目录

下载split_bootimg.pl

3、解压boot_img-ramdisk.gz:

执行 :gzip -dc ../boot.img-ramdisk.gz | cpio -i  命令后会在当前面目录下生成一个ramdisk目录,这个目录的内容就是上面个说的root目录

里面的内容,在这里面你可以修改init.rc 和default.prop 文件

a、在init.rc里可以修改系统目录为都写权限,修改system为读写mount yaffs2 mtd@system /system rw remount

b、使adb具有root权限
default.prop

修改为:

default.prop

ro.secure=0

ro.allow.mock.location=1

ro.debuggable=1

persist.service.adb.enable=1

命令解释:

ro.secure=0 默认开启未知源APK
ro.allow.mock.location=1 开启模拟位置
ro.debuggable=1 调试模式开
persist.service.adb.enable=1 adb远程开

想修添加自己的服务可以在init.rc里添加。这里不在介绍。

4、把修改的内容在打包成boot.img

首先用mkbootfs 命令将解压的ramdisk目录在打成boot.img-ramdisk.gz,

执行 mkbootfs ramdisk | gzip >boot.img-ramdisk.gz

然后在用新生成的boot.img-ramdisk.gz生成boot.img

执行 mkbootimg --kernel boot.img-kernel --ramdisk boot.img-ramdisk.gz --base 0x02600000 -o boot.img

这样就生成了一个修改过的boot.img镜像文件,将boot.img镜像文件弄到机器里重启后就会有相应的功能了。

注:对mkbootimg --kernel boot.img-kernel --ramdisk boot.img-ramdisk.gz --base 0x02600000 -o boot.img 命令中的基地址

0X02600000的确定简单的介绍一下,首先看下面两附图:


  


圈一:安卓的boot.img标准的文件头格式:ANDROID!(8字节)  

圈二:kernel_size(4字节)

圈三:kernel_addr(4字节)

圈四:ramdisk_size(4字节)

圈五:ramdisk_addr(4字节)   

圈六:second_stage_size(4字节)

圈七:second_stage_addr(4字节)

图八:tags_addr(4字节)

圈九:page_size(4字节)

kernel地址,应为base+0x00008000 (一般都是固定的)

ramdisk地址,应为base+0x01000000 (一般都是固定的)

secondstage地址,应为base+0x00f00000 (一般都是固定的)

tags地址,应为base+0x00000100  (一般都是固定的)

page是页长,为1k(1024)的整数倍。此处为0x00000800,十进制为2048。 (这个每个系统可以会不同)

kernel_size:0030f68c

kernel_addr:02608000

所以基地址=0x02608000-0x00008000=02600000

ramdisk_size:0003742e

ramdisk_addr:03600000

所以基地址=0x03600000-0x01000000=02600000

second_stage_size:00000000

second_stage_addr:03500000

所以基地址=0x03500000-0x00f00000=02600000

tags_addr:02600100

所以基地址=0x02600100-0x00000100=02600000

这四个基地址不一样是,以少数服从多数原则选择,打包完成后手工修正不相同的那个addr。


通过fastboot命令将boot.img push 到机器里看下篇文章

0 0
原创粉丝点击