【问题标题】:Error with repacking boot.img (Android)重新打包 boot.img 时出错 (Android)
【发布时间】:2015-03-09 11:44:35
【问题描述】:

我有带有 AOSP ROM 4.4.4 的 Nexus 5。

我正在尝试从设备中“拉”boot.img,解压缩它,编辑“init.rc”,将其重新打包为 boot.img 并将其刷入设备。

我遵循了许多指南,但没有一个与我有相同的场景:

http://droidcore.blogspot.co.il/2012/12/how-to-edit-initrc-in-android.htmlhttp://www.digitalinternals.com/mobile/android-mmc-mmcblk-partition-layout/259/

  1. 设备分区是 mmcblck 所以从ls -l /dev/block/platform/msm_sdcc.1/by-name/我得到引导是/dev/block/mmcblk0p19

lrwxrwxrwx root root 1971-02-28 21:30 开机-> /dev/block/mmcblk0p19

  1. 我使用以下命令创建了 boot.img:cat /dev/block/mmcblk0p19 > /mnt/sdcard/boot.img 并将此 boot.img 拉到我的电脑上。此 boot.img 约为 23 MB。

  2. 我使用http://droidcore.blogspot.co.il/2012/12/how-to-edit-initrc-in-android.html 中的工具unmkbootimg boot.img 并获得2 个文件:initramfs.cpio.gz 约为500 KB 和kernel.gz 约为8.4 MB。我得到的详细信息是:

内核大小 8405280

内核地址0x8000

Ramdisk 大小 498992

内存盘地址0x2900000

二级尺码0

二级地址0xf00000

内核标签地址0x2700000

Flash 页面大小 2048

板名是“”

命令行“console=ttyHSL0,115200,n8 androidboot.hardware=hammerhead user_debug=31 maxcpus=2 msm_watchdog_v2.enable=1"

提取 kernel.gz

... 正在提取 initramfs.cpio.gz ...

全部完成。


要重新编译此映像,请使用:

mkbooting --kernel kernel.gz --ramdisk initramfs.cpio.gz --base 0x26fff00 --cmdline 'console=ttyHSL0,115200,n8 androidboot.hardware=hammerhead user_debug=31 maxcpus=2 msm_watchdog_v2.enable=1' -o new_boot.img

  1. 我用命令:gunzip -c initramfs.cpio.gz | sudo sh -c 'cd ../ && cpio -i'(来自http://www.wiki.xilinx.com/Build+and+Modify+a+Rootfs)解压initramfs.cpio.gz,得到了很多文件,其中包括init.rc。我编辑了这个文件。

  2. 我使用以下命令重新打包 initramfs.cpio.gzsh -c 'cd ../ && sudo find . | sudo cpio -H newc -o' | gzip -9 > new_initramfs.cpio.gz,得到了这个文件 ~500KB。

  3. 现在我使用命令mkbootimg 这两个文件:./mkbooting --kernel kernel.gz --ramdisk initramfs.cpio.gz --base 0x26fff00 --cmdline 'console=ttyHSL0,115200,n8 androidboot.hardware=hammerhead user_debug=31 maxcpus=2 msm_watchdog_v2.enable=1' -o new_boot.img,然后我得到了大约 8.5 MB 的 boot.img

  4. 现在将启动闪存到设备,设备卡在第一个屏幕上(未启动)

我的问题是:

  1. 怎么了?

  2. 我的新 boot.img 只有 8.5 MB 而不是原来的 23 MB,这正常吗?

谢谢你们!

****************** 我发现了问题 *************

解决方案是: 我从这里使用unmkbootimghttp://whiteboard.ping.se/Android/Unmkbootimg 运行 unmkbootimg 后,我得到了以下评论:

*** 警告 **** 此映像是使用非标准 mkbootimg 构建的! OFF_KERNEL_ADDR 为 0xFD908100 OFF_RAMDISK_ADDR 为 0x00200100 OFF_SECOND_ADDR 为 0xFE800100 请使用上述值修改 mkbootimg.c 以构建您的映像。


所以我按照这里的说明进行操作:https://gist.github.com/jberkel/1087757 现在它可以工作了!!!

【问题讨论】:

  • 我也想这样做,但只在 Windows (!) 上使用 imgutil.exe 时成功。

标签: android linux build linux-kernel boot


【解决方案1】:

我无法回答第一个问题,但如果我是你,我会跳过第 4 步和第 5 步并验证 unmkbootimg/mkbootimg 过程是否正确。只有经过验证后,我才会处理cpio进程,最后是init.rc编辑。

关于第二个问题,google官方的boot.img是8.64MB,所以我猜大小​​没有问题。

【讨论】:

  • 我试过了(跳过第 4 步和第 5 步),但效果不佳。您知道他们如何计算“基本”偏移量吗?也许问题在那里?谢谢!
  • 我发现了问题:boot.img 是用不同的偏移量构建的(不是默认的),所以我用相关的偏移量重新编译了 mkbootimg!非常感谢!
  • @kande,也许你可以分享一下细节,这样其他人就不会犯同样的错误了。 :)
【解决方案2】:

Ubuntu 的 abootimg 对我有用。我使用了更新 (-u) 选项。

【讨论】:

    猜你喜欢
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    • 2015-06-21
    相关资源
    最近更新 更多