(Nexus One)アプリケーションをSDカードにインストール(A2SD)

Android 2.2(Froyo)から使えるようになった、アプリケーションをSDカードにインストールする機能*1ですが、SDカードへインストールできないアプリケーションがあったり、dalvik-cacheは内蔵ストレージのままだったりと、内蔵ストレージの使用削減効果がいまひとつです。
そこで、/data以下のディレクトリをSDカード上のext3パーティションシンボリックリンクし、アプリケーションはSDカードにインストールするようにしました。
基本的には、KLab 仙石さんのブログのエントリーと同じ方法です。


(今回やること)

(環境とか)

    • 作業用PCにLinuxを使用する。*2
    • Nexus Oneは、root取得している。

SDカードへパーティションを作成

作業用PCでSDカードにfdiskを実行し、第一パーティションFAT32、第二パーティションext3パーティションを作成します。
mkfsコマンドでファイルシステムを作成します。

(work-host)$ sudo mkfs.vfat /dev/sdc1
(work-host)$ sudo mkfs.ext3 /dev/sdc2

Nexus Oneext3パーティションをマウント

パーティションを作成した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

Nexus Oneを再起動して、ext3パーティションが自動マウントされることを確認します。

注意すること

  • install-recovery.shに記述するmountコマンドに指定するSDカードデバイス名を、/dev/block/vold/179:2形式で指定すると、マウントできませんでした。手動mountコマンド時は、マウントできます。

*1:Apps2SD/Apps2FATとか言われているようです

*2:FAT32ext3ファイルシステムを作成できるOSならOK

*3:mvコマンドはパーティション超えでの移動ができない(?)かも