Android エミュレーターの rootfs に永続的な編集を加える方法
Android エミュレーターで Read-only file system に書き込めるようにする で rootfs は揮発性だと書きました。 つまり、再起動すると加えた変更が元に戻ってしまうのです。
これは、rootfs が Initramfs という RAM 上に展開されるファイルシステムのためです。 RAM 上に展開されたファイルシステムに変更を加えても、その実体には変更が反映されないので 再起動後には消えてしまうというわけです。
この Initramfs、実体は cpio アーカイブを gzip 圧縮したものなので、以下のようにして永続的に変更を反映させることができます。
参考
ramdisk.img の場所を確認
~/.android/avd/AVD_NAME/hardware-qemu.ini
の disk.ramdisk.path
が rootfs の実体となるファイルを示しているので確認します。
disk.ramdisk.path = ANDROID-SDK_DIR/system-images/android-21/default/x86_64//ramdisk.img
ramdisk.img の展開
空のディレクトリ1を作り、先ほど確認した ramdisk.img
を展開します。
$ mkdir ramdisk $ cd ramdisk $ gunzip -c ANDROID-SDK_DIR/system-images/android-21/default/x86_64/ramdisk.img | cpio -i |
ramdisk
dir 以下に ramdisk.img の中身が展開されているはずです。
編集
ファイルの追加や編集を行います。
起動に使用する設定ファイルやスクリプトを書き換えると、正常に起動しなくなる可能性があるので注意しましょう。
再アーカイブ
ramdisk
ディレクトリにいることを確認し、以下のように圧縮します。
$ pwd ~/ramdisk $ find . | cpio -R 0:0 -o -H newc | gzip > ../my_ramdisk.img |
エミュレーターに登録
以下のようにして、ramdisk.img
を入れ替えれば、エミュレーターからマウントされるようになります。
$ cd ANDROID-SDK_DIR/system-images/android-21/default/x86_64 $ mv ramdisk.img ramdisk.img.bak $ cp ~/my_ramdisk.img ramdisk.img |
本来ならば、元の ramdisk.img
を書き換えるのは避けたいところです。
しかし、~/.android/avd/AVD_NAME/hardware-qemu.ini
を編集してもエミュレーターの起動時にデフォルト設定に書きなおされてしまいます2。
そのため、今回は ramdisk.img
を直接変更する方法をとりました。