boot.img修改大全
来源:互联网 发布:淘宝标题组词 编辑:程序博客网 时间:2024/04/30 20:06
1、备份boot.img(前提是必须有root权限的手机)
adb shell
su
cat /proc/mtd
备份boot.img命令举例如下(切记手机不同,命令不一定相同,请核对自己手机上一步的显示):
cat /dev/mtd/mtd1 >/sdcard/boot.img
2、挂载主机的一个文件夹到VMware虚拟机(我比较习惯VMware)。
sudo mount -t vmhgfs .host:/ /mnt/hgfs/
例如:挂载主机d:\123文件夹到虚拟机/mnt/hgfs/目录下,虚拟机访问修改/mnt/hgfs/mmm/文件夹下的文件相当于主机访问修改d:\123文件夹下的文件(mmm是d:\123共享到虚拟机的文件名)。这样做的好处就是linux下解开要修改的文件,然后可以很方便的在windows下修改了。若要详细设置挂载可以查看我的另一篇博文。
3、将所需工具放入/bin/目录下并添加执行权限:
mv /mnt/hgfs/mmm/split_bootimg.pl /bin/
mv /mnt/hgfs/mmm/mkbootimg /bin/
mv /mnt/hgfs/mmm/mkbootfs /bin/
chmod +x /bin/split_bootimg.pl
chmod +x /bin/mkbootimg
chmod +x /bin/mkbootfs
4、解开boot.img
mkdir /mnt/hgfs/mmm/boot
cp /mnt/hgfs/mmm/boot.img /mnt/hgfs/mmm/boot/
cd /mnt/hgfs/mmm/boot
split_bootimg.pl boot.img
此时BOOT目录下会多出几个文件,boot.img-ramdisk.gz和boot.img-kernel。
mkdir ramdisk
cd ramdisk
gzip -dc ../boot.img-ramdisk.gz | cpio -i
我们对即将要修改的init.rc也备份一下吧:
cp ./init.rc ../init.rc.backup
5、修改init.rc使含有a2sd功能:
a、搜索class_start default,在这一行之前,加入两行代码:
start a2sd
on property:cm.filesystem.ready=1
b、在最末尾加入:
service a2sd /system/bin/logwrapper /system/bin/sh /system/bin/a2sd
disabled
oneshot
c、修改system为读写
mount yaffs2 mtd@system /system rw remount
d、修改su的相关代码:
chown root system /system/bin/su
chmod 4550 /system/bin/su
改为:
chown root root/system/bin/su
chmod 6755 /system/bin/su
6、加入第二屏
要确定到底是那种格式的图片,方法是打开initrd\init文件,搜索logo,就会看到。
a、加入logo.bmp到boot.img\ramdisk.gz\initrd\(官方一般采用这种方法,切记此处的bmp不是一般的bmp)
photoshop制作480*800的图片,然后水平翻转一下,再保存为BMP,BMP保存选项中,选择高级模式:16位 R5 G6 B5,保存
b、加入initlogo.rle到boot.img\ramdisk.gz\initrd\(一般第三方的boot或者recovery都采用这种方式)
一、将rle转换为png:
(1)将rle要转成raw格式:
from565 -rle logo.rle logo.raw
(2)再将raw转成png格式:
convert -depth 8 -size 480x800 rgb:logo.raw logo.png
convert为ImageMagick自带命令,如果没有安装,命令如下:
sudo apt-get install imagemagick
二、将png转换为rle:
(1) 制作当前屏幕像素的图片(模拟器默认为320*480)
使用PS制作一张320*480的图片,保存时选“保存为 Web 所用格式”,然后在弹开的窗口上,“预设”项选择“PNG-24”,保存为android_logo.png
注:好像只支持png-24,其他格式生成的rle文件显示不正常,有兴趣大家可以再验证一下。
(2) 将图片转换为raw格式
使用linux下的ImageMagick自带的convert命令,进行raw格式转换,命令为:
convert -depth 8 android_logo.png rgb:android_logo.raw
注:ubuntu 10.04 默认已经安装ImgageMagick工具,如果当前系统没有安装,可以执行下面的命令安装:
sudo apt-get install imagemagick
(3) 将raw格式转化为rle文件
需要用到android编译后的rgb2565工具,在android/out/host/linux-x86/bin目录下(android为当前源码所在目录),转换命令如下:
rgb2565 -rle < android_logo.raw > initlogo.rle
到目前为止,启动需要显示的图像已经做好了,就是initlogo.rle,注意文件名必须是这个,如果想改文件名,需要修改android/system/core/init/init.h中的宏:
#define INIT_IMAGE_FILE "/initlogo.rle"
7、使adb具有root权限 :
boot\ramdisk.gz\initrd\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远程开
8、打包boot.img:
mkbootfs ramdisk |gzip >ramdisk-new.gz
mkbootimg --kernel boot.img-kernel --ramdisk ramdisk-new.gz --base 0x02600000-o boot-new.img
9、上述命令中的0x02600000为基址(base),手机不同基址不一定相同,确定方法为:
圈一:安卓的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
10、修正addr:
例如有的rom四个基址不一样,可以少数服从多数的原则选择基址,打包完成后手工修正不相同的那个addr。
11、page_size
打包软件默认page_size为800h,而有的rom本身page_size为1000h,如遇到这种情况,可以这样操作:
(1)、手工修正page_size为1000。
(2)、在页长处手工增加2048(十进制)的空数据。
(2)、在kernel和ramdisk之间手工增加2048(十进制)的空数据。
12、手工分割boot.img文件:
(1)头文件=1个页长
(2)kernel:
开始位置:页长结尾的下一个数据
结尾:从开始到kernel大小
例如上述列子中的kernel为:
开始位置:800h
结尾:800+0030F68C-1=30FE8Bh
(3)ramdisk:
开始位置:kernel结尾往下(此处一般为00)第一个数字1F8B(此亦为gz文件的标志)
结尾:从开始到ramdisk的大小
13、刷入a2sd文件,并开启:
a2sd reinstall 安装或者重装a2sd。
a2sd zipalign 这个参数能让apk的访问速度稍微加快。
a2sd remove 移除a2sd
a2sd cachesd 将Dalvik Cache也放入EXT分区。
附:linux下的十六进制编辑器:ghex2。命令如下:apt-get install ghex
Windows下可以使用bootimg.exe修改boot.img
D:\temp\boot>bootimg /?
supported arguments:
--cpio-list
--repack-565
--repack-bootimg
--repack-ramdisk
--repack-rle
--unpack-565
--unpack-bootimg
--unpack-ramdisk
--unpack-rle
--unpack-updata
--unpack-yafffs
--unpack-yaffs
--unpack-yaffs2
1、解开boot.img
bootimg.exe --unpack-bootimg
输出如下:
arguments: [bootimg file]
bootimg file: boot.img
output: kernel[.gz] ramdisk[.gz] second[.gz]
base=0x2600000
page_size=2048
name=""
cmdline="androidboot.hardware=blade console=null"
padding_size=2048
2、解开ramdisk.gz
bootimg.exe --unpack-ramdisk
输出如下:
arguments: [ramdisk file] [directory]
ramdisk file: ramdisk.gz
directory: initrd
output: cpiolist.txt
please remove initrd
添加或删除文件后,必须修改cpiolist.txt中的相应内容
3、打包ramdisk
bootimg.exe --repack-ramdisk
输出如下:
arguments: [cpiolist file]
cpiolist file: cpiolist.txt
output: ramdisk.cpio.gz
4、打包boot
bootimg.exe --repack-bootimg 0x2600000 "" 2048 2048
输出如下:
arguments: [base] [cmdline] [page_size] [padding_size]
kernel: kernel
ramdisk: ramdisk.cpio.gz
second:
base: 0x2600000
cmdline:
page_size: 2048
padding_size: 2048
output: boot.img
===============================================
#define PHYSICAL_DRAM_BASE 0×00200000<!–IWMS_AD_BEGIN–> //基址,各不相同,我们的目的是为了获得这个基址,但由于没有ROM源代码,这貌似是不可能的。<!–IWMS_AD_END–>
#define KERNEL_ADDR (PHYSICAL_DRAM_BASE + 0×00008000)
#define RAMDISK_ADDR (PHYSICAL_DRAM_BASE + 0×01000000)
#define TAGS_ADDR (PHYSICAL_DRAM_BASE + 0×00000100)
#define NEWTAGS_ADDR (PHYSICAL_DRAM_BASE + 0×00004000)
#define SECOND_STAGE_ADDR (PHYSICAL_DRAM_BASE + 0x00F00000)
复制代码
,PHYSICAL_DRAM_BASE就是我们所谓的基地址,在编译boot.img时一个必填的参数,但是这个基地址不同的手机是不一样的,所以我们的目的是得到这个基地址。
我以找出Arc的基地址为例,首先下载一个Arc正常的boot.img,然后用winhex打开
arc
基址:00200000
kernel_size:0033A664
kernel_addr:00208000
所以基地址=0×00208000-0×00008000
ramdisk_size:000EBA56
ramdisk_addr:012000002
所以基地址=0×01200000-0×01000000
second_stage size:00000000
second_stage addr:01100000
所以基地址=0×01100000-0x00F00000
tags_addr:00200100
所以基地址=0×00200100-0×00000100
page_size:00000800
于是我们得到Arc的基地址就是0×00200000,猜测Neo的基地址跟Arc也一样,于是编译,实验,成功,证明Arc/Neo的基地址都是0×00200000。
========================================================
boot.img recovery.img还有一个重要的参数,基址 base,用于告诉手机从哪个地址开始,是准备给内存盘的入口,哪个地址是给kernel的入口。如果你对不上号,对不起,不能不能启动手机。
在android系统ROM的boardconfig.h中存在地址偏移的define:
#define PHYSICAL_DRAM_BASE 0x00200000 //这就是定义基址,各手机是不一样的
#define KERNEL_ADDR (PHYSICAL_DRAM_BASE + 0x00008000) //内核地址
#define RAMDISK_ADDR (PHYSICAL_DRAM_BASE + 0x01000000) //散存盘地址
#define TAGS_ADDR (PHYSICAL_DRAM_BASE + 0x00000100)
#define NEWTAGS_ADDR (PHYSICAL_DRAM_BASE + 0x00004000)
boot.img是怎么打包在一起的呢?找到bootimg.c文件,看吧。 header + padding + kernel + padding + ramdisk + padding + ...
所以一个boot.img或者recovery.img开头的结构具体如下:
4 * 2, magic,固定为"ANDROID!"
4 * 1, kernel长度,小端unsigned类型
4 * 1, kernel地址,应为base + 0x00008000
4 * 1, ramdisk长度,小端unsigned
4 * 1, ramdisk地址,应为base + 0x01000000
4 * 1, second stage长度,小端unsigned,为0
4 * 1, second stage地址,应为base + 0x00f00000
4 * 1, tags地址,应为base + 0x00000100
4 * 1, page大小,小端unsigned, 为2048或者4096
4 * 2, 未使用,固定为0x00
4 * 4, 板子名字,一般为空
4 * 128, 内核命令参数,一大串
4 * 8, id,不知道啥玩意,0x00
以我们官方原生的recovery为例,如下图:
从图中我们可以知道: 41 4E 44 52 4F 49 44 21 就是Magic Number ,内容是固定的ANDROID!。一一对应
kernel_size就是D4 C9 31 00 -->0x0031C9D4。注意,小端读法。是Byte内,顺读,整个类型中,逆读。
kernel_addr即00 80 40 80 -->0x 80408000。根据 KERNEL_ADDR (PHYSICAL_DRAM_BASE + 0x00008000),所以PHYSICAL_DRAM_BASE=0x80400000.
ramdisk_size是:D3 25 10 00 -->0x001025D3。
ramdisk_addr即00 00 40 81 -->0x81400000。根据RAMDISK_ADDR (PHYSICAL_DRAM_BASE + 0x01000000),所以PHYSICAL_DRAM_BASE=0x80400000.
second_stage size:00000000
second_stage addr:00 00 30 81 -->0x81300000.根据RAMDISK_ADDR (PHYSICAL_DRAM_BASE + 0x00f00000),所以PHYSICAL_DRAM_BASE=0x80400000.
tags_addr:00 01 40 80 -->0x80400100.根据TAGS_ADDR (PHYSICAL_DRAM_BASE + 0x00000100),所以PHYSICAL_DRAM_BASE=0x80400000.
page_size:00 80 -->0x0800.这是页长。页长一般都为1K(1024)的整数倍吧,此处页长是0x0800,转为十进制,则是2048
根据上面的计算咱们A6390/A6388的基址为:PHYSICAL_DRAM_BASE=0x80400000
同时我们在图上还能看到,传入内核的参数为:
'rootwait console=ttyS2,115200n8 videoout=omap24xxvout omapfb.vram=0:2M omap_vout.vid1_static_vrfb_alloc=y omap_vout.video1_numbuffers=6 omap_vout.vid2_static_vrfb_alloc=y omap_vout.video2_numbuffers=6'
综上,我们在打包A6390/A6388的boot.img或recovery.img时,使用mkbootimg的具体参数为:
./mkbootimg --cmdline 'rootwait console=ttyS2,115200n8 videoout=omap24xxvout omapfb.vram=0:2M omap_vout.vid1_static_vrfb_alloc=y omap_vout.video1_numbuffers=6 omap_vout.vid2_static_vrfb_alloc=y omap_vout.video2_numbuffers=6' --kernel recovery.img-kernel --ramdisk ramdisk-new.gz --base 0x80400000 -o boot-new.img
其中recovery.img-kernel为新内核;ramdisk-new.gz为新的内存盘;boot-new.img为生成的新img.
按照此方法打包的boot.img或recovery.img因为基址和内核参数都正确可以直接在A6390/A6388上使用,不用做任何修改.
即不用做上面"自制A6390的recovery"的第8、9、10步。这三步在当时做的时候虽然可用了,但是不知为啥可用,现在总算解释清楚了。
- boot.img修改大全
- 修改boot.img
- 修改boot.img .
- 修改boot.img
- 修改boot.img
- boot.img的修改
- 修改Nexus5的boot.img
- 解包 boot.img 修改后,新生成 boot.img
- ubuntu下修改boot.img的方法
- 关于boot.img和recovery.img的编辑和修改
- 关于boot.img和recovery.img的编辑和修改
- 关于boot.img和recovery.img的编辑和修改
- 关于boot.img和recovery.img的修改和编辑
- 批处理修改boot.ini大全
- android系统支持app2sd(修改boot.img)
- 修改boot.img文件的工具,mkbootfs,mkbootimg,unpackbootimg
- 修改nexus 7的boot.img,打开系统调试
- android boot.img 结构
- 复制对象(三)属性的copy特性(续)
- 士兵杀敌一
- 手写链表(一)
- [转]ls命令的20个实用范例
- Android DecorView浅析
- boot.img修改大全
- linux vi 命令大全
- Thinkpad X201i 自带win7改xp失败----大白菜ghost安装后 重启电脑不认硬盘的解决方法
- 每日二逼事 汇总 哈哈
- 混迹的一些SAP技术QQ群,无以为家
- 简单密码破解
- The Transition from Qt 4.x to Qt 5
- python学习笔记
- 网站XSS跨站攻击脚本语法