(Nexus One)アプリケーションをSDカードにインストール(A2SD)
Android 2.2(Froyo)から使えるようになった、アプリケーションをSDカードにインストールする機能*1ですが、SDカードへインストールできないアプリケーションがあったり、dalvik-cacheは内蔵ストレージのままだったりと、内蔵ストレージの使用削減効果がいまひとつです。
そこで、/data以下のディレクトリをSDカード上のext3パーティションにシンボリックリンクし、アプリケーションはSDカードにインストールするようにしました。
基本的には、KLab 仙石さんのブログのエントリーと同じ方法です。
(今回やること)
(環境とか)
SDカードへパーティションを作成
作業用PCでSDカードにfdiskを実行し、第一パーティションにFAT32、第二パーティションにext3のパーティションを作成します。
mkfsコマンドでファイルシステムを作成します。
(work-host)$ sudo mkfs.vfat /dev/sdc1 (work-host)$ sudo mkfs.ext3 /dev/sdc2
Nexus Oneでext3パーティションをマウント
パーティションを作成したSDカードを装着し、Nexus Oneをブートします。
FAT32パーティションは、/dev/block/mmcblk0p1(/dev/block/vold/179:1)という形で認識され、/mnt/sdcardに自動マウントされます。
# mount /dev/block/vold/179:1 /mnt/sdcard vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0 /dev/block/vold/179:1 /mnt/secure/asec vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
ext3パーティションは、/dev/block/mmcblk0p2(/dev/block/vold/179:2)という形で認識されていますが、当然ながら自動マウントはされません。
まずは、以下のコマンドを実行し、手動でマウントしてみます。
# mount -o rw,remount /dev/block/mtdblock3 /system <- /systemがリードオンリーなため、書き込み可でリマウント # mkdir /system/disk # mount -t ext3 -o nosuid,nodev /dev/block/mmcblk0p2 /system/disk # mount /dev/block/mmcblk0p2 /system/disk ext3 rw,nosuid,nodev,relatime,errors=continue,data=writeback 0 0
今回は、以下のディレクトリに対して/system/disk以下にシンボリックリンクするので、ディレクトリを作成しておきます。
-
- /data/app
- /data/app-private
- /data/dalvik-cache
# mkdir /system/disk/app # chown system.system /system/disk/app # chmod 775 /system/disk/app # mkdir /system/disk/app-private # chown system.system /system/disk/app-private # chmod 775 /system/disk/app-private # mkdir /system/disk/dalvik-cache # chown system.system /system/disk/dalvik-cache # chmod 775 /system/disk/dalvik-cache
既存アプリケーション移行・シンボリックリンク作成
既存アプリケーションを/system/disk以下のディレクトリへ移行します。
mvコマンドを使用して移行しようと思いましたが、"Cross-device link"エラーで移行できませんでした。*3
# mv /data/app/app-name.apk /system/disk/app-name.apk failed on 'app-name.apk' - Cross-device link
私のNexus Oneは、最近フルリストアしたばかりでしたので、アプリケーションはアンインストールし移行しませんでした。
AppMonsterでSDカードへバックアップ、シンボリックリンク作成後にSDカードから戻せば移行はできるかもしれません。
アプリケーションの移行(コピー)方法は、別途調査しようと思います。
アプリケーション移行後(移行していませんが、、、)、シンボリックリンクを作成します。
# cd /data # rmdir app # ln -s /system/disk/app app # rmdir app-private # ln -s /system/disk/app-private app-private # rm -r /data/dalvik-cache/* # rmdir dalvik-cache # ln -s /system/disk/dalvik-cache dalvik-cache
/data以下はこんな感じになります。
# ls -l /data drwx------ system system 2010-12-11 17:52 backup drwxrwx--x shell shell 2010-12-11 17:47 local lrwxrwxrwx root root 2010-12-11 17:36 app-private -> /system/disk/app-private lrwxrwxrwx root root 2010-12-11 17:36 app -> /system/disk/app drwxrwxr-x system system 2010-12-11 23:18 system drwxrwx--x system system 2010-12-11 14:00 anr drwx------ root root 2010-12-11 14:24 property drwxrwx--x system system 2010-12-11 21:37 data drwxrwx--t system misc 2010-12-11 22:15 misc drwxr-x--- root log 2010-12-11 14:00 dontpanic lrwxrwxrwx root root 2010-12-11 17:41 dalvik-cache -> /system/disk/dalvik-cache drwxrwx--- root root 2010-12-11 14:00 lost+found
ext3パーティションの自動マウント
Nexus One起動時に、SDカードのext3パーティションが自動マウントされるように、/system/etc/install-recovery.shに以下のスクリプトを追加します。
mount -t ext3 -o nosuid,nodev /dev/block/mmcblk0p2 /system/disk exit 0
編集は作業用PCで行います。文字コードは、UTF-8で編集します。
(work-host)$ adb pull /system/etc/install-recovery.sh ~/work/tmp/install-recovery.sh (work-host)$ cat ~/work/tmp/install-recovery.sh #!/system/bin/sh mount -t ext3 -o nosuid,nodev /dev/block/mmcblk0p2 /system/disk exit 0 if ! applypatch -c MTD:recovery:2048:c6e012cdba4d87377575ac4080a033bcf6589c11; then (省略) (work-host)$ adb push ~/work/tmp/install-recovery.sh /system/etc/install-recovery.sh
注意すること
- install-recovery.shに記述するmountコマンドに指定するSDカードデバイス名を、/dev/block/vold/179:2形式で指定すると、マウントできませんでした。手動mountコマンド時は、マウントできます。