Android ダイナミックパーティション構成における vendor イメージのカスタマイズと super イメージ再構築フロー

コンパイル済みの super.img を端末に書き込んだ後、Camera サービスが起動しない障害が発生した。ブートログを解析すると、data パーティション(/dev/block/sda5)のマウントに失敗しており、その参照定義は /vendor/etc/fstab に記述されていることが確認できた。

Camera サービスの実体は system.img に含まれるが、起動プロセスにはベンダー領域の以下のリソースが必須となる。

  • VINTF マニフェスト定義: /vendor/etc/vintf/manifest.xml
  • HAL Provider デーモン: /vendor/bin/hw/android.hardware.camera.provider
  • ベンダー共有ライブラリ: /vendor/lib64/hw/camera.<variant>.so
  • 初期化スクリプト: /system/etc/init/hw/init.rc

依存関係を整理すると、修正対象は vendor.img に集中する。しかし、lpunpack による展開確認ではクライアント提供版とローカルビルド版に差分があり、かつ vendor.img は標準的なマウント操作では書き込み許可が付与されない制限がある。

この制約を回避するため、イメージをリードオンリーでマウントして作業用ディレクトリに複製し、修正適用後にビルドツリーへ統合して再パッケージ化する手順を構築した。

# 作業領域とマウントポイントの準備
mkdir -p extract_workspace/vendor_ro

# Sparse形式のsuperイメージをraw形式に変換し、動的パーティションを展開
simg2img source_super.img super_flat.bin
lpunpack super_flat.bin extract_workspace

cd extract_workspace
# vendorイメージをリードオンリーでマウントし、編集用コピーを作成
mount -o ro vendor.img vendor_ro
cp -a vendor_ro vendor_editable

# 任意の修正(例: camera HALライブラリの上書き)を vendor_editable 内で実施
# 既存のビルド出力ディレクトリからvendorフォルダを削除し、編集済みフォルダを配置
rm -rf ${AOSP_OUT}/target/product/${TARGET_DEVICE}/vendor
mv vendor_editable ${AOSP_OUT}/target/product/${TARGET_DEVICE}/vendor

ディレクトリの置換が完了したら、古いイメージキャッシュを削除し、新規にベンダーイメージを生成する。

rm -f vendor*.img
make vendorimage

出力された vendor.img はsparse形式(Linux rev 1.0 ext2)である。これを lpmakesuper.img に再統合する際、各パーティションのサイズ引数を実際のファイルサイズ(バイト単位)へ更新する必要がある。再構築スクリプトは以下のように構成する。

#!/bin/bash
# パーティションサイズ定義(単位: バイト)
SZ_SYS=1158778880
SZ_SYS_EXT=114483200
SZ_VND=215457792
SZ_PRD=328126464
SZ_DLKM=10448896

lpmake \
    --metadata-size 65536 \
    --super-name super \
    --metadata-slots 2 \
    --virtual-ab \
    --device super:3221225472 \
    --group dynamic_grp:3210739712 \
    --partition system:readonly:${SZ_SYS}:dynamic_grp \
    --image system=system.img \
    --partition system_ext:readonly:${SZ_SYS_EXT}:dynamic_grp \
    --image system_ext=system_ext.img \
    --partition vendor:readonly:${SZ_VND}:dynamic_grp \
    --image vendor=vendor.img \
    --partition product:readonly:${SZ_PRD}:dynamic_grp \
    --image product=product.img \
    --partition vendor_dlkm:readonly:${SZ_DLKM}:dynamic_grp \
    --image vendor_dlkm=vendor_dlkm.img \
    --sparse \
    --output final_super.img

カーネル領域のカスタマイズが必要な場合、boot.img の展開・修正・再パッケージ化は以下の手順で実施可能である。

# bootイメージの展開環境作成
mkdir boot_stage
simg2img src_boot.img boot_raw.ext4
mount -t ext4 -o loop boot_raw.ext4 boot_stage

# デバイスツリーとカーネルバイナリの配置
cp -a arch/arm64/boot/dts/vendor/*.dtb boot_stage/
cp -a arch/arm64/boot/Image.itb boot_stage/

# sparse形式のext4イメージとして再構築
make_ext4fs -l 134217728 -s custom_boot.img boot_stage
umount boot_stage

タグ: android-dynamic-partitions lpmake vendor-image sparse-image bootimg

5月25日 02:32 投稿