Andorid: AVD中のramdisk.imgとsystem.imgの作り直し方

Androidエミュレータの/init.rcの編集と、/system/xbin/suコマンドの入れ替えのために、AVD(Android Virtual Device)中のramdisk.imgとsystem.imgを作り直しました。
以下、その手順です。(AVDがAndroid2.3.3の例です。)

[ramdisk.imgの作り直し]

AVDがAndroid2.3.3(APIレベル10)の場合、ルートディレクトリ / にread-onlyでマウントされているrootfsのイメージは<SDKルート>platforms/android-10/images/ramdisk.imgに格納されています。ramdisk.imgはcpioのnew ASCII(new (SVR4) portable)フォーマットをgzipで圧縮したファイルです。
なので、作り直す手順(/init.rcの編集)は次のようになります。

gunzipで解凍 => cpioで展開 => /init.rcの編集 => cpioでアーカイブ => gzipで圧縮

実行例:

# cp <SDKルート>platforms/android-10/images/ramdisk.img .
# mv ramdisk.img ramdisk.gz
# gunzip ramdisk.gz
# mkdir ramdisk-files
# cd ramdisk-files
# cpio -iI ../ramdisk

# ls -F
data/         dev/   init.goldfish.rc*  proc/  sys/     ueventd.goldfish.rc
default.prop  init*  init.rc*           sbin/  system/  ueventd.rc

# vi init.rc
export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin
               ↓(変更)
export PATH /data/local/bin:/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin
# find | cpio -H newc -oO ../ramdisk.new  ←(10/14/2011 誤植修正)
# cd ..
# gzip ramdisk.new
# mv ramdisk.new.gz ramdisk.new.img

これを次のようにしてramdisk.imgに上書きするか、
# cp <SDKルート>platforms/android-10/images/ramdisk.img <SDKルート>platforms/android-10/images/ramdisk.img.orig
# cp ramdisk.new.img <SDKルート>platforms/android-10/images/ramdisk.img

あるいは次のようにして、エミュレータ起動時に指定します。
# cp ramdisk.new.img <SDKルート>platforms/android-10/images
# cd <SDKルート>tools
# ./emulator -avd AVD名 -ramdisk ../platforms/android-10/images/ramdisk.new.img

[system.imgの作り直し]

AVDがAndroid2.3.3(APIレベル10)の場合、/system にread-onlyでマウントされているファイルシステムのイメージは<SDKルート>platforms/android-10/images/system.imgに格納されています。system.imgはyaffs2(Yet Another Flash File System 2)のイメージファイルです。
作り直す手順(/system/xbin/suコマンドの入れ替え)は次のようになります。

unyaffsコマンドで展開 => xbin/suコマンドの入れ替え => mkyaffs2imageコマンドでイメージファイル作成

mkyaffs2imageコマンドとunyaffsコマンドはそれぞれ以下のサイトからダウンロードできます。
http://sourceforge.jp/projects/sfnet_fatplus/downloads/yaffs2-binary.tar...
http://code.google.com/p/unyaffs/downloads/list

実行例:

# ls
yaffs2-binary.tar su unyaffs
# tar xvf yaffs2-binary.tar
# cp <SDKルート>platforms/android-10/images/system.img .
# mkdir system-files
# cd system-files
# ../unyaffs ../system.img

# ls -F
app/  bin/  build.prop  etc/  fonts/  framework/  lib/  media/  tts/  usr/  xbin/

# cp xbin/su xbin/su.orig
# cp ../su xbin
# chmod 6755 xbin/su
# ../yaffs2/utils/mkyaffs2image . ../system.new.img

これを次のようにしてsystem.imgに上書きするか、
# cp <SDKルート>platforms/android-10/images/system.img <SDKルート>platforms/android-10/images/system.img.orig
# cp ../system.new.img <SDKルート>platforms/android-10/images/system.img

あるいは次のようにして、エミュレータ起動時に指定します。
# cp ../system.new.img <SDKルート>platforms/android-10/images
# cd <SDKルート>tools
# ./emulator -avd AVD名 -system ../platforms/android-10/images/system.new.img

ramdiskとsystemと両方指定する場合は、
# ./emulator -avd AVD名 -ramdisk ../platforms/android-10/images/ramdisk.new.img -system ../platforms/android-10/images/system.new.img