【转】 boot.img的解包与打包

原文网址:http://blog.csdn.net/wh_19910525/article/details/8200372

Android 产品中,内核格式是Linux标准的zImage根文件系统采用ramdisk格式。这两者在Android下是直接合并在一起取名为boot.img,会放在一个独立分区当中。这个分区格式是Android自行制定的格式。

Android开发时,最标准的做法是重新编译于内核和根文件系统,然后调用Android给的命令行文件mkbootimg(out/host/linux-x86/bin/)来打包。

在制作手机ROM时,有时会单独编译内核或抽出根文件进行修改内容,比如我只编译内核,其余的地方不变。这样重新安装巨大的Android开发环境实在不划算。因此很多boot.img解包工具被人开发出来,这一些工具都是把内核和根文件系统从一个现成的boot.img抽取出来,修发后再次打包还原。

一.常见的解包工具

因为boot.img的格式比较简单,它主要分为三大块(有的可能有四块)

+—————–+
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)

因此很多人开发分析工具,有是linux shell脚本,比如repack-zImage,也有人采用perl,还有C语言编写的 unbootimg,

我使用的是在源码位置system/core/mkbootimg/ 下的 mkbootimg。为了简化,蓝点工坊把与mkbootimg中打包工具和解包工具以及所包含的libmincrpty库抽出来,并且重写一个Makefile,作为开源项目。
使用者只需要在linux(需安装gcc,make,一般是标配)或windows(需要安装mingw)的命令行执行make,即可产生可执行文件 mkbootimg ,unpackbootimg

二.解/打包工具使用

解包工具:unpackbootimg

usage: unpackbootimg
-i|–input boot.img
[ -o|--output output_directory]
[ -p|--pagesize ]

常见格式
unpackbootimg -i .\tmp\boot.img -o .\out

这一句命令行表示把boot.img解包,所有文件输出到out目录下

它会解压出如下文件:

boot.img-zImage (内核文件)

boot.img-ramdisk.gz (根文件系统打包文件)
boot.img-cmdline (mkbootimg cmdline参数)
boot.img-pagesize (mkbootimg pagesize参数)

boot.img-base (mkbootimg base参数)

 

打包工具:mkbootimg (Android自带)

H:\ttt>mkbootimg.exe
error: no output filename specified
usage: mkbootimg
       --kernel <filename>
       --ramdisk <filename>

       [ --second <2ndbootloader-filename> ]
       [ --cmdline <kernel-commandline> ]
       [ --board <boardname> ]
       [ --base <address> ]
       [ --pagesize <pagesize> ]
       -o|--output <filename>

常见的命令格式:
./mkbootimg --cmdline ‘no_console_suspend=1 console=null‘ --kernel zImage --ramdisk boot/boot.img-ramdisk.gz -oboot.img --base 02e00000
这句含义是把内核文件zImage和boot目录下的根文件压缩包 boot.img-ramdisk.gz打包成boot.img.
其中cmdline和base的值均来源于unpackbootimg的结果

时间: 2024-11-05 20:49:04

【转】 boot.img的解包与打包的相关文章

使用apktool解包和打包apk

使用apktool解包和打包apk 下载apktool工具 解包 apktool d xxx.apk -f 植入代码 使用apktool解包要植入代码的apk(下面称为A), 使用apktool解包包括待植入代码的apk(下面称为B). -将B的AndroidManifest.xml中对应的权限和各组件声明信息拷贝到A中. -把B的对应的smali文件拷贝到A中. -把B的对应的布局文件拷贝到A中. -把植入布局中对应的id从B的values/ids.xml拷贝到A中. -把植入布局中对应的id

CentOS7 tar打包工具 打包,解包,打包压缩,打包解压缩

tar命令 選項與參數: -c :建立打包檔案,可搭配 -v 來察看過程中被打包的檔名(filename) -t :察看打包檔案的內容含有哪些檔名,重點在察看『檔名』就是了: -x :解打包或解壓縮的功能,可以搭配 -C (大寫) 在特定目錄解開 特別留意的是, -c, -t, -x 不可同時出現在一串指令列中. -z :透過 gzip 的支援進行壓縮/解壓縮:此時檔名最好為 *.tar.gz -j :透過 bzip2 的支援進行壓縮/解壓縮:此時檔名最好為 *.tar.bz2 -J :透過 x

java基础类型包装类与自动打包解包

一基础类型包装类 基础数据类型存放在内存的栈区域,可以通过包装类将基础数据类型转换为引用数据类型,即存储在堆与栈中. 基础数据类型一共有8种,相对应的包装类也有8种.分别是Byte,Short,Integer,Long,Float,Double,Character,Boolean.类 包装类位于java.Lang包中. 1 public class Test1 { 2 3 public static void main(String[] args) { 4 // TODO Auto-genera

如何解包,编辑,重新打包boot images

HOWTO: Unpack, Edit, and Repack Boot Images http://forum.xda-developers.com/showthread.php?t=443994 Several people have already figured out the details on their own, but I have gotten requests to do a more comprehensive tutorial on how the boot and r

Lua学习教程之 可变参数数据打包与解包

利用table的pack与unpack进行数据打包与解包,测试代码如下: print("Test table.pack()----------------"); function printTable ( t ) if type(t) == "table" then for k,v in pairs(t) do printTable(v); end else print(t); end end local packData =function( ... ) loca

MonoTouch 二三事(三)mono mkbundle 打包程序的解包支持

许久以后,这个续上这个系列的第三篇. 玩过mono的可能知道mono有一个工具mkbundle ,可以把mono的运行时与类库与你的程序的依赖程序集都打包成一个可执行文件,在win下为exe文件,例如mandroid.exe,mtouch.exe,在mac下的Mach-O文件,例如mtouch,mtouch-64. 根据他的源代码 https://github.com/mono/mono/tree/master/mcs/tools/mkbundle,我们得到: template_main.c i

web socket RFC6455 frame 打包、解包

#ifndef __APP_WEBSOCKET_FRAME_H__ #define __APP_WEBSOCKET_FRAME_H__ #include "memory.hpp" class buffer; struct websocket_frame { websocket_frame(); ~websocket_frame(); static const unsigned int fix_min_len = 2; static const unsigned int fix_mask

python之打包,解包

#coding:utf-8 #字符串,列表,元组打包与解包 aString = 'abc' aList = [1, 2, 3] aTuple = 'a', 'A', 1 print('Unpacking string......') first, second, third = aString print("string values:", first, second, third) print('\nUnpacking list......') first, second, thir

【Java】Java包装类,Java的自动打包(装箱)与解包(拆箱)

包装类 Java中一切都是对象,所以很多操作都是针对对象的,Java会把常用的数据类型,自动包装成相应的类的对象进行操作. jdk1.5之后支持自动的打包与解包 常用的数据类型对应的包装类 装箱 装箱就是把基本数据类型变为相应类的对象 ArrayList list = new ArrayList();//list的各种操作都是针对对象的 list.add(5);//5本来是int类型的,现在自动包装成了Integer类的对象 拆箱 拆箱就是把相对应类的对象变为相应的基本数据类型 list.get