① 如何解包/编辑/打包android系统的boot.img文件
目录
1、背景知识
2、boot和recovery映像的文件结构
3、对映像文件进行解包、编辑、打包的常规方法
3.1、另一种解包、编辑、打包的方法
4、将新的映像刷回到手机
5、解包、编辑、打包为我们带来了什么
6、本文讲的内容与使用update.zip刷机包不是一码事
正文
1、背景知识
Android手机的文件系统有许多存储器组成,以下是在adb shell下面的输出:
#cat/proc/mtd
dev: size erasesize name
mtd0: 00040000 00020000 "misc"
mtd1: 00500000 00020000 "recovery"
mtd2: 00280000 00020000 "boot"
mtd3: 04380000 00020000 "system"
mtd4: 04380000 00020000 "cache"
mtd5: 04ac0000 00020000 "userdata"
注意,不同的手机在上述存储设备的顺序可能会各不相同!一定要检查您的手机,确定在以下的操作中选择正确的设备号(mtdX,这个X的序号一定要检查清楚)。
在本向导中,我们主要描述对"recovery"和"boot"的存储设备进行操作;"system"存储设备保存了android系统目录的所有数据(在系统启动后会挂载到“system/”目录);“userdata”存储设备将保存了android数据目录中的所有数据(在系统启动后会挂载到“data/”目录,里面是会有很多应用数据以及用户的preference之类的配置数据)。
从上面的输出可以看出来,recovery和boot分区对应着/dev/mtd/mtd1和/dev/mtd/mtd2,在你您开始做任何修改之前一定要做两件事情,第一件事情,一定要先对这两个分区进行备份。
可以使用如下命令进行备份:
# cat/dev/mtd/mtd1>/sdcard/recovery.img
# cat/dev/mtd/mtd2>/sdcard/boot.img
(注意,只有手机获取了ROOT权限以后才能够执行上述的备份命令)
第二件事情,你您应该把你您最喜欢的update.zip刷机包放置到你您的sd卡的根目录上面。如此一来,即使你您在后续的操作中出了问题,也可以启动到recovery模式进行恢复。
另外一个你您需要知道的重要文件是在android系统目录下的/system/recovery.img,此文件是mtd1存储设备的完全拷贝。这个文件在每次关机的时候,会自动地被写回到mtd1存储设备里面。
这会意味着两个事情:
(1)任何对/dev/mtd/mtd1中数据的直接修改都会在下一次重启手机以后消失。
(2)如果希望对/dev/mtd/mtd1进行修改,最简单的做法是用你您自己的recovery.img替换掉/system/recovery.img。当你您创建自己的update.zip刷机包的时候(特别是在做刷机包的适配的时候),如果你您忘记替换这个/system/recovery.img,这个recovery.img就会在关机的时候被烧写到mtd1里面去或许会变砖。一定要注意这一点!
(译者的话,关于这个/system/recovery.img文件,在2.1的android的平台里面并没有找到,或许这个机制已经out了?!或者偶本人对这段话的理解不够深入?!希望明白的朋友不吝斧正)
2、boot和recovery映像的文件结构
boot和recovery映像并不是一个完整的文件系统,它们是一种android自定义的文件格式,该格式包括了2K的文件头,后面紧跟着是用gzip压缩过的内核,再后面是一个ramdisk内存盘,然后紧跟着第二阶段的载入器程序(这个载入器程序是可选的,在某些映像中或许没有这部分)。此类文件的定义可以从源代码android-src/system/core/mkbootimg找到一个叫做
bootimg.h的文件。
(译者的话,原文是一个叫做mkbootimg.h的文件,但从Android 2.1的代码来看,该文件名应该是改为bootimg.h了)。
/*
** +-----------------+
** | boot header | 1 page
** +-----------------+
** | kernel | n pages
** +-----------------+
** | ramdisk | m pages
** +-----------------+
** | second stage | o pages
** +-----------------+
**
** n = (kernel_size + page_size - 1) / page_size
** m = (ramdisk_size + page_size - 1) / page_size
** o = (second_size + page_size - 1) / page_size
**
** 0. all entities are page_size aligned in flash
** 1. kernel and ramdisk are required (size != 0)
** 2. second is optional (second_size == 0 -> no second)
** 3. load each element (kernel, ramdisk, second) at
** the specified physical address (kernel_addr, etc)
** 4. prepare tags at tag_addr. kernel_args[] is
** appended to the kernel commandline in the tags.
** 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr
** 6. if second_size != 0: jump to second_addr
** else: jump to kernel_addr
*/
ramdisk映像是一个最基础的小型文件系统,它包括了初始化系统所需要的全部核心文件,例如:初始化init进程以及init.rc(可以用于设置很多系统的参数)等文件。
以下是一个典型的ramdisk中包含的文件列表:
./init.trout.rc
./default.prop
./proc
./dev
./init.rc
./init
./sys
./init.goldfish.rc
./sbin
./sbin/adbd
./system
./data
recovery映像包含了一些额外的文件,例如一个叫做recovery的二进制程序,以及一些对该程序支持性的资源图片文件(当你您按下home+power组合键的时候就会运行这个recovery程序)。
典型的文件列表如下:
./res
./res/images
./res/images/progress_bar_empty_left_round.bmp
./res/images/icon_firmware_install.bmp
./res/images/indeterminate3.bmp
./res/images/progress_bar_fill.bmp
./res/images/progress_bar_left_round.bmp
./res/images/icon_error.bmp
./res/images/indeterminate1.bmp
./res/images/progress_bar_empty_right_round.bmp
./res/images/icon_firmware_error.bmp
./res/images/progress_bar_right_round.bmp
./res/images/indeterminate4.bmp
./res/images/indeterminate5.bmp
./res/images/indeterminate6.bmp
./res/images/progress_bar_empty.bmp
./res/images/indeterminate2.bmp
./res/images/icon_unpacking.bmp
./res/images/icon_installing.bmp
./sbin/recovery
3、对映像文件进行解包、编辑、打包的常规方法
(注意,下面我给你您介绍的是手工命令行方式进行解包以及重新打包的方法,但是我仍然创建了两个perl脚本,这两个脚本可以让你您的解包和打包工作变得轻松许多。
如果你您很擅长使用16进制编辑器的话,你您可以打开boot.img或者recovery.img,然后跳过开始的2K的头数据,然后寻找一大堆0的数据,在这一堆0的数据后面,紧跟着1F 8B这两个数字(1F 8B是gzip格式的文件的结束标记)。从此文件开始的地方(跳过2K的头),一大堆0后面紧跟着到1F 8B这两个数字为止的全部数据(不包括1F 8B),就是gzip压缩过的linux内核。从1F 8B开始一直到文件的结尾包含的全部数据,就是ramdisk内存盘的数据。你您可以把把内核和ramdisk两个文件分别保存下来,在进行分别的修改和处理。我们可以通过un-cpio和un-gzip操作来读取ramdisk文件中的数据,可以使用如下的命令来实现这个目的,以下操作会生成一个目录,直接cd进去就可以看到ramdisk中的数据了:
gunzip -c ../your-ramdisk-file | cpio -i
此命令可以将ramdisk中的所有的文件解包到当前的工作目录下面,然后就可以对它进行编辑了。
当需要重新打包ramdisk的时候,就需要re-cpio然后re-gzip这些数据和目录,可以通过如下命令来实现:(cpio会把所有当前目录下面的文件都打包进去,因此,在进行此步骤之前,请把不需要的文件都清除掉。)
find . | cpio -o -H newc | gzip > ../newramdisk.cpio.gz
最后一步就是通过 mkbootimg这个工具,把kernel和ramdisk打包在一起,生成一个boot.img:
mkbootimg --cmdline 'no_console_suspend=1 console=null'
--kernel your-kernel-file --ramdisk newramdisk.cpio.gz -o mynewimage.img
这里的mkbootimg工具会在编译android的源代码的时候会在~/android-src/out/host/linux-x86/bin目录下面自动生成。
现在,如果不想背这些复杂的命令或者摆弄那个让人眩晕的16进制编辑器的话,可以尝试使用我编写的用于解包和打包的perl脚本了。希望这些脚本能够节约各位的键盘。
3.1、另一种解包、编辑、打包的方法
下载 split_bootimg.zip文件,在此zip文件中包含一个perl文件,split_bootimg.pl脚本,该脚本可以读取boot.img头(根据 Android源码中的bootimg.h读取)将kernel和ramdisk读取出来,此脚本也会输出内核命令行和板子名字。
(注意,不要使用从/dev/mtd/mtd2直接拷贝出来的boot.img,此映像可能在读取过程遭到损坏。)
下面是一个从TC4-RC28更新中提取出来的boot.img进行解包操作:
% ./split_bootimg.pl boot.img
Page size: 2048 (0x00000800)
Kernel size: 1388548 (0x00153004)
Ramdisk size: 141518 (0x000228ce)
Second size: 0 (0x00000000)
Board name:
Command line: no_console_suspend=1
Writing boot.img-kernel ... complete.
Writing boot.img-ramdisk.gz ... complete.
解包ramdisk的命令如下:
% mkdir ramdisk
% cd ramdisk
% gzip -dc ../boot.img-ramdisk.gz | cpio -i
% cd ..
解码完毕后,就可以修改了(例如,在default.prop设置ro.secure=0等等)
使用mkbootfs工具(mkbootfs工具是编译完毕Android源代码以后,就会在~/android-src/out/host/linux-x86/bin自动生成)来重新创建ramdisk,可以使用如下命令来操作:
% mkbootfs ./ramdisk | gzip > ramdisk-new.gz
使用mkbootimg来重新创建boot.img,mkbootimg也可以在~/android-src/out/host/linux-x86/bin目录中可以找到:
% mkbootimg --cmdline 'no_console_suspend=1 console=null'
--kernel boot.img-kernel --ramdisk ramdisk-new.gz -o boot-new.img
(注意:console=null的命令行选现是从TC4-RC30的boot.img引入的,用以去掉root shell)
4、将新的映像刷回到手机
可以将recovery.img拷贝到/system目录下面,然后重新启动手机,让手机自动为你您刷写到mtd里面(工作原理在上面已经提过了)。对于boot.img可以通过将其拷贝到sd卡的根目录,然后通过手机内的刷写工具将此映像写入到手机中。
例如,使用 adb工具( Android SDK中的一个工具)将boot.img拷贝到手机的sd卡的根目录:
adb push ./mynewimage.img /sdcard
然后通过adb shell登录手机(获取过 ROOT的)的shell交互模式,利用命令行进行交互:
# cat /dev/zero >/dev/mtd/mtd2
write: No space left on device [this is ok, you can ignore]
# flash_image boot /sdcard/mynewimage.img
然后重启手机。
如果手机能够正常启动,那么祝贺你您,你您的修改和替换已经成功了;如果不能够顺利启动,则需要重新启动进入recovery模式,并且使用update.zip来恢复。
5、解包、编辑、打包为我们带来了什么
可以修改手机开机启动时候的画面
You can display a "splash" screen of sorts upon boot. You just have to have a file named initlogo.rle in your root directory. The trick is that the root directory is overwritten each time you boot with the contents of your boot image (mtd2). There are instructions elsewhere on the forums for updating this image.
You can prove to yourself that this works by just ing logo.rle to initlogo.rle in your updated boot image and you will see the "G1" screen twice.
The hurdle I'm running into is generating my own images. There is a program called [url=]to565[/url] that takes in an image and spits out the resulting image in the appropriate format (give it the -r flag to generate an rle) [edit, correct flag is -rle]. However, everything I generate with this just looks like random colored bars when I boot up (and sometimes at the bottom of the screen I see part of whatever was left in the framebuffer when I shut down). Supposedly to565 takes in a raw rgb888 file, and perhaps I'm not generating those properly. I tried saving to "raw image" from gimp but so far everything is just different variations on colored bars.
I may give up at this point, but I thought others might be interesting in picking up where I left off.
6、本文讲的内容与使用update.zip刷机包不是一码事
您可以很容易地在其他论坛上看到关于如何自制update.zip刷机包的方法,也可以下载到很多在网络上共享的自制刷机包。例如:近期的多数刷机包都来自对rc30包的修改和调整。在update.zip刷机包里面会包括新的boot.img,recovery.img以及整个system/目录下的若干文件的替换和更新。如果您希望自己自制boot.img以及recovery.img,建议您选取相对较新的更新和版本。(选用较老的映像的话,或许会出现兼容性问题)。
② 如何解包/编辑/打包android系统的boot.img文件
1
boot映像并不是一个完整的文件系统,它是一种android自定义的文件格式,该格式包括了2K的文件头,后面紧跟着是用gzip压缩过的内核,再后面是一个ramdisk内存盘,然后紧跟着第二阶段的载入器程序(这个载入器程序是可选的,在某些映像中或许没有这部分)。此类文件的定义可以从源代码android-src/system/core/mkbootimg找到一个叫做bootimg.h的文件。
2
/*
** +-----------------+
** | boot header | 1 page ** +-----------------+
** | kernel | n pages ** +-----------------+
** | ramdisk | m pages ** +-----------------+
** | second stage | o pages ** +-----------------+ **
** n = (kernel_size + page_size - 1) / page_size ** m = (ramdisk_size + page_size - 1) / page_size ** o = (second_size + page_size - 1) / page_size **
** 0. all entities are page_size aligned in flash ** 1. kernel and ramdisk are required (size != 0)
** 2. second is optional (second_size == 0 -> no second) ** 3. load each element (kernel, ramdisk, second) at ** the specified physical address (kernel_addr, etc) ** 4. prepare tags at tag_addr. kernel_args[] is ** appended to the kernel commandline in the tags. ** 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr ** 6. if second_size != 0: jump to second_addr ** else: jump to kernel_addr */
ramdisk映像是一个最基础的小型文件系统,它包括了初始化系统所需要的全部核心文件,例如:初始化init进程以及init.rc(可以用于设置很多系统的参数)等文件
看这里是不是显得头大呢,,,今天哥们分享的教程是比较简单的,不需要认识这些东西是做什么的,有什么用,。只需要要一个简单的工具就能实现你想要解包boot.img的问题。。。
3
下载一个ROM助手,网络搜索下就行,最好是官网下载,蘑菇论坛。
安装并打开它,在主界面上你会找到“解包IMG”功能的按钮,
4
点击后把你的boot镜像文件加载进去,等待几分钟,就能把boot的镜像解开了 ,,上面提示打开文件夹,点击之后,就能找到boot解开后的全部内容,在这里你想怎么编辑就怎么编辑。
看到木有boot解包就是这么简单,其实ROM助手还可以解包recovery 、userdara等镜像文件。只要用了就看到,步骤和上面的操作时一样的 。
5
K!好了,修改大家就自己去奋斗吧,其实说实话,安卓本来基于LINUX就是在那系统下玩的,用WINDOWS的就比较吃亏了。。截止目前ROM助手还没有打包功能,相信他们开发团队很快就能完善这项功能的说。我这里根据我的经验来分享下如何打包boot镜像文件,这里需要用命令符
开始-运行-cmdd:回车cd boot回车bootimg --repack-bootimg 0x200000 "mem=211M console=null androidboot.hardware=qcom" 2048 4096
出现“output boot.img”的字样就显示打包成功
6
到这里就完全打包解包无压力了,额,recovery userdara 解包打包,就直接按照这个操作步骤即可完成。
③ rk3188的uboot.img怎么编译
U-Boot编译命令对于mini2440开发板,编译U-Boot需要执行如下的命令:$makemini2440_config$makeall使用上面的命令编译U-Boot,编译生成的所有文件都保存在源代码目录中。为了保持源代码目录的干净,可以使用如下命令将编译生成的文件输出到一个外部目录,而不是在源代码目录中,下面的2种方法都将编译生成的文件输出到/tmp/build目录:$exportBUILD_DIR=/tmp/build$makemini2440_config$makeall或$makeO=/tmp/buildmini2440_config(注意是字母O,而不是数字0)$makeall为了简化分析过程,方便读者理解,这里主要针对第一种编译方式(目标输出到源代码所在目录)进行分析。2.1.2U-Boot配置、编译、连接过程U-Boot开头有一些跟主机软硬件环境相关的代码,在每次执行make命令时这些代码都被执行一次。1.U-Boot配置过程(1)定义主机系统架构HOSTARCH:=$(shelluname-m|\sed-es/i.86/i386/\-es/sun4u/sparc64/\-es/arm.*/arm/\-es/sa110/arm/\-es/powerpc/ppc/\-es/ppc64/ppc/\-es/macppc/ppc/)“sed–e”表示后面跟的是一串命令脚本,而表达式“s/abc/def/”表示要从标准输入中,查找到内容为“abc”的,然后替换成“def”。其中“abc”表达式用可以使用“.”作为通配符。命令“uname–m”将输出主机CPU的体系架构类型。作者的电脑使用IntelCore2系列的CPU,因此“uname–m”输出“i686”。“i686”可以匹配命令“sed-es/i.86/i386/”中的“i.86”,因此在作者的机器上执行Makefile,HOSTARCH将被设置成“i386”。(2)定义主机操作系统类型HOSTOS:=$(shelluname-s|tr'[:upper:]''[:lower:]'|\sed-e's/\(cygwin\).*/cygwin/')“uname–s”输出主机内核名字,作者使用Linux发行版Ubuntu9.10,因此“uname–s”结果是“Linux”。“tr'[:upper:]''[:lower:]'”作用是将标准输入中的所有大写字母转换为响应的小写字母。因此执行结果是将HOSTOS设置为“linux”。(3)定义执行shell脚本的shell#Setshelltobashifpossible,otherwisefallbacktoshSHELL:=$(shellif[-x"$$BASH"];thenecho$$BASH;\elseif[-x/bin/bash];thenecho/bin/bash;\elseechosh;fi;fi)"$$BASH"的作用实质上是生成了字符串“$BASH”(前一个$号的作用是指明第二个$是普通的字符)。若执行当前Makefile的shell中定义了“$BASH”环境变量,且文件“$BASH”是可执行文件,则SHELL的值为“$BASH”。否则,若“/bin/bash”是可执行文件,则SHELL值为“/bin/bash”。若以上两条都不成立,则将“sh”赋值给SHELL变量。由于作者的机器安装了bashshell,且shell默认环境变量中定义了“$BASH”,因此SHELL被设置为$BASH。(4)设定编译输出目录ifdefOifeq("$(originO)","commandline")BUILD_DIR:=$(O)endifendif函数$(origin,variable)输出的结果是一个字符串,输出结果由变量variable定义的方式决定,若variable在命令行中定义过,则origin函数返回值为"commandline"。假若在命令行中执行了“exportBUILD_DIR=/tmp/build”的命令,则“$(originO)”值为“commandline”,而BUILD_DIR被设置为“/tmp/build”。ifneq($(BUILD_DIR),)saved-output:=$(BUILD_DIR)#.$(shell[-d${BUILD_DIR}]||mkdir-p${BUILD_DIR})若${BUILD_DIR}表示的目录没有定义,则创建该目录。#Verifyifitwassuccessful.BUILD_DIR:=$(shellcd$(BUILD_DIR)&&/bin/pwd)$(if$(BUILD_DIR),,$(erroroutputdirectory"$(saved-output)"doesnotexist))endif#ifneq($(BUILD_DIR),)若$(BUILD_DIR)为空,则将其赋值为当前目录路径(源代码目录)。并检查$(BUILD_DIR)目录是否存在。OBJTREE:=$(if$(BUILD_DIR),$(BUILD_DIR),$(CURDIR))SRCTREE:=$(CURDIR)TOPDIR:=$(SRCTREE)LNDIR:=$(OBJTREE)……MKCONFIG:=$(SRCTREE)/mkconfig……ifneq($(OBJTREE),$(SRCTREE))obj:=$(OBJTREE)/src:=$(SRCTREE)/elseobj:=src:=endifCURDIR变量指示Make当前的工作目录,由于当前Make在U-Boot顶层目录执行Makefile,因此CURDIR此时就是U-Boot顶层目录。执行完上面的代码后,SRCTREE,src变量就是U-Boot代码顶层目录,而OBJTREE,obj变量就是输出目录,若没有定义BUILD_DIR环境变量,则SRCTREE,src变量与OBJTREE,obj变量都是U-Boot源代码目录。而MKCONFIG则表示U-Boot根目录下的mkconfig脚本。2.makemini2440_config命令执行过程下面分析命令“makemini2440_config”执行过程,为了简化分析过程这里主要分析将编译目标输出到源代码目录的情况。mini2440_config:unconfig@$(MKCONFIG)$(@:_config=)其中的依赖“unconfig”定义如下:unconfig:@rm-f$(obj)include/config.h$(obj)include/config.mk\$(obj)board/*/config.tmp$(obj)board/*/*/config.tmp\$(obj)include/autoconf.mk$(obj)include/autoconf.mk.dep其中“@”的作用是执行该命令时不在shell显示。“obj”变量就是编译输出的目录,因此“unconfig”的作用就是清除上次执行make*_config命令生成的配置文件(如include/config.h,include/config.mk等)。$(MKCONFIG)在上面指定为“$(SRCTREE)/mkconfig”。$(@:_config=)为将传进来的所有参数中的_config替换为空(其中“@”指规则的目标文件名,在这里就是“mini2440_config”。$(text:patternA=patternB),这样的语法表示把text变量每一个元素中结尾的patternA的文本替换为patternB,然后输出)。因此$(@:_config=)的作用就是将mini2440_config中的_config去掉,得到mini2440。因此“@$(MKCONFIG)$(@:_config=)”实际上就是执行了如下命令:./mkconfigmini2440即将“mini2440”作为参数传递给当前目录下的mkconfig脚本执行。在mkconfig脚本中给出了mkconfig的用法:#Parameters:TargetArchitectureCPUBoard[VENDOR][SOC]因此传递给mkconfig的参数的意义分别是:mini2440:Target(目标板型号)arm:Architecture(目标板的CPU架构)arm920t:CPU(具体使用的CPU型号)mini2440:Boardsamsung:VENDOR(生产厂家名)s3c24x0:SOC
④ ubuntu 解压boot.img问题 bash: tools/unpackbootimg: No such file or directory
你是想解压这个boot.img吗,它报错是说tools/unpackbootimg没有这个文件阿,请cd进入相应目录在试一下
⑤ 如何编译 boot.img
快速编译system.img,可以使用这个命令:
#make systemimage
快速编译boot.img,可以使用以下命令:
#make bootimage
快速编译userdata.img,可以使用以下命令:
# make userdataimage-nodeps
但是,对于bootimage, 在不改变内存布局的情况下,可以使用以下命令:
#cp ./arch/arm/boot/Image ./arch/arm/boot/kernel
#mkbootimg --kernel ./arch/arm/boot/kernel --ramdisk
../out/target/proct/tcc8800/ramdisk.img --cmdline
console=ttyTCC,115200n8 --base 0x40000000 --pagesize 8192 --output
../out/target/proct/tcc8800/boot.img
其实这些生成命令都在build/core/Makefile中.
生成boo.img的方法:
$(INSTALLED_BOOTIMAGE_TARGET):$(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES)
$(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) --output $@
......
生成system.img的方法:
define build-systemimage-target
$(MKYAFFS2) -f $(mkyaffs2_extra_flags) $(TARGET_OUT) $(1)
生成userdata.img的方法
define build-userdataimage-target
mkdir -p $(TARGET_OUT_DATA)
$(MKYAFFS2) -f $(mkyaffs2_extra_flags) $(TARGET_OUT_DATA)
$(INSTALLED_USERDATAIMAGE_TARGET)
同样,ramdisk.img的生成方法为:
BUILT_RAMDISK_TARGET := $(PRODUCT_OUT)/ramdisk.img
INSTALLED_RAMDISK_TARGET := $(BUILT_RAMDISK_TARGET)
$(INSTALLED_RAMDISK_TARGET): $(MKBOOTFS) $(INTERNAL_RAMDISK_FILES) |
$(MINIGZIP)
$(MKBOOTFS) $(TARGET_ROOT_OUT) | $(MINIGZIP) > $@
为方便起见,也可以在Makefile中加入以下内容:
BUILT_RAMDISK_TARGET := $(PRODUCT_OUT)/ramdisk.img
.PHONY: ramdiskimage
ramdiskimage: ${BUILT_RAMDISK_TARGET}
然后,就可以输入:make ramdiskimage 来编译ramdisk.img文件了
最简单的方法是:
out/host/linux-x86/bin/mkbootfs out/target/proct/tcc8900/root |
out/host/linux-x86/bin/minigzip >
out/target/proct/tcc8900/ramdisk.img
⑥ 如何解包/编辑/打包android系统的boot.img文件
Android产品中,内核格式是Linux标准的zImage,根文件系统采用ramdisk格式。这两者在Android下是直接合并在一起取名为boot.img,会放在一个独立分区当中。这个分区格式是Android自行制定的格式。Android开发时,最标准的做法是重新编译于内核和根文件系统,然后调用Android给的命令行文件mkbootimg(out/host/linux-x86/bin/)来打包。 在制作手机ROM时,有时会单独编译内核或抽出根文件进行修改内容,比如我只编译内核,其余的地方不变。这样重新安装巨大的Android开发环境实在不划算。因此很多boot.img解包工具被人开发出来,这一些工具都是把内核和根文件系统从一个现成的boot.img抽取出来,修发后再次打包还原。一.常见的解包工具因为boot.img的格式比较简单,它主要分为三大块(有的可能有四块)因此很多人开发分析工具,有是linuxshell脚本,比如repack-zImage,也有人采用perl,还有C语言编写的unbootimg, 我使用的是在源码位置system/core/mkbootimg/下的mkbootimg。为了简化,蓝点工坊把与mkbootimg中打包工具和解包工具以及所包含的libmincrpty库抽出来,并且重写一个Makefile,作为开源项目。使用者只需要在linux(需安装gcc,make,一般是标配)或windows(需要安装mingw)的命令行执行make,即可产生可执行文件mkbootimg,unpackbootimg。二.解/打包工具使用解包工具:unpackbootimg常见格式 unpackbootimg-i.\tmp\boot.img-o.\out 这一句命令行表示把boot.img解包,所有文件输出到out目录下它会解压出如下文件:boot.img-zImage(内核文件)boot.img-ramdisk.gz(根文件系统打包文件) boot.img-cmdline(mkbootimgcmdline参数) boot.img-pagesize(mkbootimgpagesize参数) boot.img-base(mkbootimgbase参数)打包工具:mkbootimg(Android自带)常见的命令格式: ./mkbootimg --cmdline'no_console_suspend=1console=null' --kernel zImage --ramdisk boot/boot.img-ramdisk.gz -o boot.img--base02e00000 这句含义是把内核文件zImage和boot目录下的根文件压缩包boot.img-ramdisk.gz打包成boot.img. 其中cmdline和base的值均来源于unpackbootimg的结果
⑦ 如何解包/编辑/打包boot.img文件
①在手机上sys下是可以看到init.rc的,但是修改完之后重启就自动恢复到boot.img中的默认状态,所以我们修改的不是这个文件,而是boot.img中的init.rc
②修改boot.img
rom中是不可能直接看到init.rc这个文件的,因为它在boot.img中,如何解包打包boot.img呢?
答案是,用厨房吧......
打开厨房后,你会发现它本身就有为rom添加init.d支持的功能,当然你可以直接选择,然后一切自动完成,随后打包rom就OK了
如果想给自己进阶一下,研究到底如何手动添加这个功能,就接着看吧
第一步,解包boot.img,选择0进入高级操作菜单后,
接下来选择20,再选择w,
提示解包结束后,进入BOOT_Extract/boot.img-ramdisk下,找到init.rc,接下来就是修改它了
修改方法
1、在init.rc的class_start区域中加入(搜索class_start default,在下面之前加入;如果没有这段,搜索class_start,在前面加入,注意是另起一行)
start sysinit
复制代码
2、在最下面(service区域中)加入(直接添加到末尾就行了)
service sysinit /system/bin/logwrapper /system/xbin/busybox run-parts /system/etc/init.d
disabled
oneshot
复制代码
保存后(这个过程中厨房不要关闭了,虽然关闭也没有事,但是一直开着方便操作),用厨房选择b,回车,等待,搞定,从工作文件夹提出boot.img,线刷或者卡刷boot.img就行了
解包boot.img也可以不用厨房,不过很麻烦,这里就不说了。
⑧ 如何编译boot和android
直接编译 make bootimage ,会自动生成boot.img的
boot镜像不是普通意义上的文件系统,而是一种特殊的Android定制格式,由boot header,压缩的内核,ramdisk以及second stage loader(可选)组成,可以从mkbootimg.h文件中看到。
⑨ ubuntu编译内核,make bzImage之后应该怎么做
vmlinuz-2.6.32.60 不是文件夹 是 内核文件
按你的老师 说法是 拷贝到 /boot 目录下 命名为vmlinuz-2.6.6
不过我建议 最好按标准命名 vmlinuz-内核版本号-系统版本-系统构架
如vmlinuz-2.6.32-220.el6.x86_64
如果你编译没有问题 把这个内核写个 grub引导就可以
#我的2个内核
[wushuyi@CentOS boot]$ ls /boot/vmlinuz*
/boot/vmlinuz-2.6.32-220.el6.x86_64 /boot/vmlinuz-2.6.32-279.el6.x86_64
我的 grub 引导
[wushuyi@CentOS boot]$sudo vim /boot/grub/menu.lst
title CentOS (2.6.32-279.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-279.el6.x86_64 ro root=UUID=1d0ea9b9-a330-46b6-b9cc-3421024a6b22 rd_NO_LUKS rd_LVM_LV=vg_centos/swap rd_NO_MD quiet rhgb crashkernel=auto LANG=en_US.UTF-8 KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM
initrd /initramfs-2.6.32-279.el6.x86_64.img
title CentOS (2.6.32-220.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-220.el6.x86_64 ro root=UUID=1d0ea9b9-a330-46b6-b9cc-3421024a6b22 rd_NO_LUKS rd_LVM_LV=vg_centos/swap rd_NO_MD quiet rhgb crashkernel=auto LANG=en_US.UTF-8 KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM
initrd /initramfs-2.6.32-220.el6.x86_64.img
你可以参考下
⑩ 如何解压boot.img文件
在很多刷机包中都会有boot.img文件,那么这个文件到底是什么呢?其实它由两部分组成,分别为kernel 和ramdisk。kernel 也就是内核,由源代码编译而成。ramdisk是一个gz压缩包,解压后有一些文件和文件夹,里面是一些图片或者配置文件。kernel 和ramdisk以二进制的方式组合起来,就是boot.img文件。
解压boot.img文件方法:
在Windows环境下,最简单的方法就是用厨房工具来解压、合并boot.img。
Linux环境下,有专门的脚本来解压boot.img,这里不再细说。
用厨房解压boot.img的方法:
下载厨房工具,放在D盘根目录下。
进入D:\Cygwin目录,双击打开Cygwin.bat
依次输入并回车: 0 – 高级定制选项 —— 20 解包或者打包一个 boot 镜像。进入Boot 镜像工具页面
把D:\Cygwin\home目录下的user目录重命名为你的用户名(一般是Administer,我的是My)
在D:\Cygwin\home\(你的用户名)目录下新建一个WORKING_052112_083904文件夹,把boot.img文件复制到该文件夹下。再新建一个system目录
回到厨房工具,输入w并回车,就开始解压boot.img了。解压后的文件在BOOT-EXTRACTED文件夹里。
修改后,在厨房上输入b就可以重新打包boot.img了