2016/10/30
Android エミュレーターの rootfs に永続的な編集を加える方法
[Android エミュレーターで Read-only file system に書き込めるようにする](http://kokufu.blogspot.jp/2016/10/android-read-only-file-system.html) で rootfs は揮発性だと書きました。 つまり、再起動すると加えた変更が元に戻ってしまうのです。 これは、rootfs が [Initramfs](https://ja.wikipedia.org/w/index.php?title=Initramfs&redirect=no) という RAM 上に展開されるファイルシステムのためです。 RAM 上に展開されたファイルシステムに変更を加えても、その実体には変更が反映されないので 再起動後には消えてしまうというわけです。 この Initramfs、実体は [cpio](https://ja.wikipedia.org/wiki/Cpio) アーカイブを [gzip](https://ja.wikipedia.org/wiki/Gzip) 圧縮したものなので、以下のようにして永続的に変更を反映させることができます。 > 参考 > > [第384回 Initramfsのしくみ:Ubuntu Weekly Recipe|gihyo.jp … 技術評論社](http://gihyo.jp/admin/serial/01/ubuntu-recipe/0384) ### 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 の展開 空のディレクトリを作り、先ほど確認した `ramdisk.img` を展開します。 ```console `gutter: false; $ 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` ディレクトリにいることを確認し、以下のように圧縮します。 ```console `gutter: false; $ pwd ~/ramdisk $ find . | cpio -R 0:0 -o -H newc | gzip > ../my_ramdisk.img ``` ### エミュレーターに登録 以下のようにして、`ramdisk.img` を入れ替えれば、エミュレーターからマウントされるようになります。 ```console `gutter: false; $ 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` を編集してもエミュレーターの起動時にデフォルト設定に書きなおされてしまいます 。 そのため、今回は `ramdisk.img` を直接変更する方法をとりました。