美文网首页
ROM定制开发教程-boot recovery解包打包

ROM定制开发教程-boot recovery解包打包

作者: X神之怒 | 来源:发表于2020-03-01 19:19 被阅读0次

一、解包打包

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

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

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

1.常见的解包工具

因为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。

2.解/打包工具使用

以下举例常用的工具,方案2为现有工具,已分享至github,更多工具可以在github上找到对应的开源项目

解包工具1: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 -o boot.img --base 02e00000

这句含义是把内核文件zImage和boot目录下的根文件压缩包 boot.img-ramdisk.gz打包成boot.img.

其中cmdline和base的值均来源于unpackbootimg的结果

工具2:bootimg.exe

bootimg.exe功能:

解包命令:bootimg.exe –unpack-bootimg

打包命令:bootimg.exe –repack-bootimg

recovery/boot文件放到bootimg.exe同一级目录即可。

更多命令:

–add-head

–cml

–cpio-list

–czlib

–dml

–dzlib

–remove-head

–repack-565

–repack-bootimg

–repack-ramdisk

–repack-rle

–repack-zte-bin

–rml

–to-ext4

–to-img

–uml

–unpack-565

–unpack-bootimg

–unpack-qsb

–unpack-ramdisk

–unpack-rle

–unpack-updata

–unpack-yafffs

–unpack-yaffs

–unpack-yaffs2

–unpack-zte-bin

二、注意事项

到android 6之后,android开启了system verify 签名,未经签名的image刷入不能开机,原因是system 挂载失败。

解决办法是修改分区挂载文件,去掉system的verify参数,高通平台为fstab.qcom

/dev/block/bootdevice/by-name/system    /system  ext4  ro,barrier=1,discard  wait,verify

相关文章

网友评论

      本文标题:ROM定制开发教程-boot recovery解包打包

      本文链接:https://www.haomeiwen.com/subject/gzmsyctx.html