Chinaunix首页 | 论坛 | 博客
  • 博客访问: 786215
  • 博文数量: 296
  • 博客积分: 5376
  • 博客等级: 大校
  • 技术积分: 2298
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-14 19:02
文章分类

全部博文(296)

文章存档

2023年(2)

2020年(2)

2018年(2)

2017年(26)

2016年(4)

2015年(19)

2014年(12)

2013年(26)

2012年(84)

2011年(50)

2010年(41)

2009年(28)

分类: Android平台

2015-01-24 15:28:10




http://ultrablog.sinaapp.com/showthread.php?p=97

  • 如何生成system.img.
    • 在源码之后在 out/host/linux-x86/bin/下面会生成一个mkyaffs2image的工具,用这个可以把system目录打包成system.img.
    • 用法:mkyaffs2image out/.../system system.img
  • 如何解包system.img?
    • 工具地址:
    • unyaffs2.zip

      Android 产品中,内核格式是Linux标准的zImage,根文件系统采用ramdisk格式。这两者在Android下是直接合并在一起取名为boot.img,会放在一个独立分区当中。这个分区格式是Android自行制定的格式。
      Android开发时,最标准的做法是重新编译于内核和根文件系统,然后调用Android给的命令行文件mkbootimg来打包。
      在制作手机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
      《repack-zImage.sh: Unpack 》
      http://forum.xda-developers.com/showthread.php?t=901152
      《Unpacking and repacking stock rom .img files》
      http://forum.xda-developers.com/showthread.php?t=1081239
      也有人采用perl,还有C语言编写的 unbootimg

      我最后选择是CM 7.0自带的unpackbootimg。这个功能比较符合的我的要求,在CM的system/core/mkbootimg当中。但是这个也理包含在整个大的Android源码中。为了简化,蓝点工坊把与mkbootimg中打包工具和解包工具以及所包含的libmincrpty库抽出来,并且重写一个Makefile,作为开源项目。
      使用者只需要在linux(需安装gcc,make,一般是标配)或windows(需要安装mingw)的命令行执行make,即可产生可执行文件 mkbootimg ,unpackbootimg。我已经把源码上传到github之上。项目地址如下:

      如果你不想安装开发环境编译,可以到这里下载我编译的好的linux/windows版本。
       这里也包含linux/windows的adb fastboot
      下面我将介绍一下如何使用这一些工具。


      二.解/打包工具使用

      解包工具:unpackbootimg
      D:\qt_prj\mkbootimg>unpackbootimg
      BUILDER:Andrew Huang 
      usage: unpackbootimg
      -i|–input boot.img
      [ -o|--output output_directory]
      [ -p|--pagesize ]
      常见格式
      unpackbootimg -i boot.img -o out
      这一句命令行表示把boot.img解包,所有文件输出到boot目录下
      它会解压出如下文件:boot.img-zImage (内核文件)
      boot.img-ramdisk.gz (根文件系统打包文件)
      boot.img-cmdline (mkbootimg cmdline参数)
      boot.img-pagesize (mkbootimg pagesize参数)
      boot.img-base (mkbootimg base参数)
      打包工具:mkbootimg (Android自带)
      D:\qt_prj\mkbootimg>mkbootimg
      BUILDER:Andrew Huang 
      error: no output filename specified
      usage: mkbootimg
      –kernel
      –ramdisk
      [ --second ]
      [ --cmdline ]
      [ --board ]
      [ --base]
      [ --pagesize ]
      [ --ramdiskaddr]-o|–output
      常见的命令格式:
      ./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的结果










      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
             --ramdisk

             [ --second <2ndbootloader-filename> ]
             [ --cmdline ]
             [ --board ]
             [ --base
      ]
             [ --pagesize ]
             -o|--output
      常见的命令格式:
      ./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的结果











      修改ramdisk笔记,望同学们能少走弯路。
      其中各点笔记未必有关联性,也没有顺序。

      1. 拿出你u880的ramdisk
      1. su
      2. cat /dev/mtd/mtd1>/sdcard/temp/mtd01-ramdisk.bin
      复制代码


      2. 血的教训bootimg是一个多功能得工具包,其中打包、解包ramdisk功能整合要求。
      2.1 首先解包,然后修改
      1. bootimg --unpack-ramdisk mtd01-ramdisk.bin
      复制代码
      2.2修改后打包
      1. bootimg --repack-ramdisk
      复制代码
      2.3刷入手机里面,手机无限重启G3第一屏,必须刷bin包解决


      3. bootimg有问题,改在手机里面解包、打包
      3.1 在data里面创建专门目录放ramdisk文件。不要在sd卡上,因为sd卡会使ramdisk文件丢失权限信息
      1. mkdir /data/ram
      复制代码
      3.2 解包
      1. gunzip -c /sdcard/mtd01-ramdisk.bin>/data/ram/ram.cpio
      2. cd /data/ram
      3. cpio -i -F /data/ram/ram.cpio
      4. rm /data/ram/ram.cpio
      复制代码
      3.3打包
      1. cd /data/ram/
      2. find .|cpio -o -H newc|gzip>/sdcard/ram.cpio.gz
      复制代码
      4 把修改后的包刷回ramdisk
      1. 找一个flash_image 的程序,放进/data里面。需要给予执行权限:
      2. chmod 777 /data/flash_image
      3. 然后刷回ramdisk
      复制代码



      5 防止变砖刷机
      经历过2、3两步的痛苦刷机经历后,想出一个办法,牺牲recovery,用recovery空间来测试ramdisk
      1. flash_image recovery /sdcard/ram.cpio.gz
      2. 然后重启到recovery,就可以使用新的ramdisk了
      3. reboot recovery
      复制代码

      6 init.rc里面不成功的代码,不知是否u880比较畸形
      6.1. 这些代码完全没反应
      1. #包含另外一个文档到init.rc里面
      2. import /init.123.rc

      3. #挂载第二主分区ext3
      4. mount ext3 /dev/block/mmcblk0p2 /mnt/AppData rw
      复制代码
      6.2. 改用外部sh脚本挂载ext3
      1. #在init.rc最后面加上
      2. service abc /def
      3.     oneshot
      4. #abc 是服务名称,/def 是脚本文件路径
      复制代码





      在linux,cygwin解包bootimg:

      cd [boot,img所在目录]
      mkdir -p ramdisk
      mkdir -p bootimg
      unpackbootimg -i boot.img -o bootimg
      gzip -df bootimg/boot.img-ramdisk.gz
      cd ramdisk
      cpio -iuv < ../bootimg/boot.img-ramdisk

      修改后重新打包

      find ./*|cpio -ov > ../bootimg/boot.img-ramdisk
      gz ../bootimg/boot.img-ramdisk
      mkbootimg --kernel ../bootimg/boot.img-zImage --ramdisk ../ramdisk/boot.img-ramdisk.gz



阅读(956) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~