Androidブートイメージの解析方法:boot.img、vendor_boot.img、vendor_boot-debug.img

ファイルタイプの確認

$ file vendor_boot.img
vendor_boot.img: data
$ file vendor_boot-debug.img
vendor_boot-debug.img: data

unpack_bootimgの使用方法

$ ./unpack_bootimg -h
usage: unpack_bootimg [-h] --boot_img BOOT_IMG [--out OUT] [--format {info,mkbootimg}] [-0]

オプション:
  -h, --help            ヘルプ表示
  --boot_img BOOT_IMG   対象イメージパス
  --out OUT             出力ディレクトリ
  --format {info,mkbootimg}
  -0, --null            null区切りの引数出力

ベンダーブートイメージの展開

bin$ ./unpack_bootimg --boot_img ../vendor_boot.img --out ../vendor_boot

出力内容例

boot magic: VNDRBOOT
kernel load address: 0x00008000
ramdisk load address: 0x01000000
vendor ramdisk size: 8479036

展開後のファイル構造

vendor_boot$ ls
bootconfig  dtb  vendor_ramdisk  vendor_ramdisk00

ファイル形式の確認

vendor_boot$ file *
bootconfig: ASCII text
dtb: Device Tree Blob
vendor_ramdisk: LZ4 compressed data

LZ4圧縮の解除

# 解凍コマンド
lz4 -d vendor_ramdisk vendor_ramdisk.cpio

# 実行例
vendor_boot$ lz4 -d vendor_ramdisk vendor_ramdisk.cpio
vendor_ramdisk: 28476928 bytes decoded

CPIOアーカイブの展開

vendor_boot$ mkdir vendor_boot_out
vendor_boot$ cd vendor_boot_out/
vendor_boot_out$ cpio -idmv < ../vendor_ramdisk.cpio

展開後のディレクトリ構造

vendor_boot_out$ tree
.
├── first_stage_ramdisk
│   ├── fstab.default
│   └── fstab.emmc
└── lib
    └── modules
        ├── altmode-glink.ko
        ├── arm_smmu.ko

デバッグイメージの解析

vendor_boot-debug-out$ tree
.
├── adb_debug.prop
├── force_debuggable
└── userdebug_plat_sepolicy.cil

WSLでのlz4インストール問題

# 通常のインストール失敗
sudo apt-get install lz4
E: Package 'lz4' has no installation candidate

# ソースからのビルド
git clone https://github.com/lz4/lz4
make && sudo make install

ツールの入手場所

# Androidビルド出力ディレクトリ
out/host/linux-x86/bin/unpack_bootimg

# 使用例
./unpack_bootimg -h

ディレクトリ構成

unpack$ tree -L 1
.
├── bin/
├── lz4-dev/
├── vendor_boot/
├── vendor_boot-debug/
└── *.img

タグ: Android linux Kernel boot-image compression

8月1日 10:50 投稿